KVO의 사용, 실용 사례: 탐색 모음 배경색 점차적 변화

3561 단어
RxCocoa는 2개의 관찰가능 시퀀스 rx를 제공합니다.observe 및 rx.observeWeakly, 그것들은 모두 KVO 메커니즘에 대한 봉인이다. 양자의 차이는 다음과 같다. (1) 성능 비교
  • rx.observe는 KVO 메커니즘의 간단한 봉인
  • 이기 때문에 더욱 효율적이다.
  • rx.observeWeakly의 실행 효율은 비교적 낮습니다. 대상의 방출을 처리해야 하기 때문에 약한 인용을 방지합니다. (대상의 dealloc 관계)
  • (2) 장면 비교 사용
  • rx를 사용합니다.observe 시 경로는strong 속성만 포함할 수 있습니다. 그렇지 않으면 시스템이 붕괴될 위험이 있습니다. rx.observeWeakly는 weak 속성에 사용할 수 있음
  • 기본 유형의 속성 수신


  • 주의: 감청하는 속성은dynamic 수식자가 필요합니다.이 견본은 rx를 사용해야 합니다.observe Weakly, rx를 사용할 수 없습니다.observe, 그렇지 않으면 순환 인용을 초래하고 메모리 유출을 일으킬 수 있습니다.
    let disposeBag = DisposeBag()
         
    @objc dynamic var message = "hangge.com"
         
    override func viewDidLoad() {
       super.viewDidLoad()
           
       // (1 )
       Observable.interval(1, scheduler: MainScheduler.instance)
          .subscribe(onNext: { [unowned self] _ in
             // 
             self.message.append("!")
       }).disposed(by: disposeBag)
             
       // message 
       _ = self.rx.observeWeakly(String.self, "message")
          .subscribe(onNext: { (value) in
             print(value ?? "")
          })
    }
    
  • 뷰 치수 변경 수신


  • 주의: 여기는 rx를 사용해야 합니다.observe, rx를 사용하면.observeWeakly는 감청이 안 돼요.
    override func viewDidLoad() {
       super.viewDidLoad()
             
       // frame 
        _ = self.rx.observe(CGRect.self, "view.frame")
                .subscribe(onNext: { frame in
                   print("---   ---")
                   print(frame!)
                   print("
    ") }) }
  • 그래디언트 탐색 모음 효과

    키코드
    // kvo 
    _ = self.tableView.rx.observe(CGPoint.self, "contentOffset")
                .subscribe(onNext: {[weak self] offset in
                   var delta = offset!.y / CGFloat(64) + 1
                   delta = CGFloat.maximum(delta, 0)
                   self?.barImageView?.alpha = CGFloat.minimum(delta, 1)
             })
    
  • import UIKit
    import RxSwift
    import RxCocoa
     
    class ViewController: UIViewController {
         
        var tableView:UITableView!
         
        //// 
        var barImageView:UIView?
         
        let disposeBag = DisposeBag()
         
        override func viewDidLoad() {
            super.viewDidLoad()
             
            // 
            self.navigationController?.navigationBar.barTintColor = .orange
             
            // 
            self.barImageView = self.navigationController?.navigationBar.subviews.first
             
            // 
            self.tableView = UITableView(frame: self.view.frame, style:.plain)
            // 
            self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
            self.view.addSubview(self.tableView!)
             
            // 
            let items = Observable.just(Array(0...100).map{ " \($0)"})
             
            // (  cellForRowAt  )
            items.bind(to: tableView.rx.items) { (tableView, row, element) in
                let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
                cell.textLabel?.text = "\(element)"
                return cell
            }
            .disposed(by: disposeBag)
             
            // kvo 
            _ = self.tableView.rx.observe(CGPoint.self, "contentOffset")
                .subscribe(onNext: {[weak self] offset in
                    print(offset?.y ?? 0.0)
    
                    var delta = offset!.y / CGFloat(64)
                    delta = CGFloat.maximum(delta, 0)
                    self?.barImageView?.alpha = CGFloat.minimum(delta, 1)
                })
        }
    }
    

    참고 문서: Swift - RxSwift의 사용 상세 설명 64(키 값은 KVO의 사용을 관찰)

    좋은 웹페이지 즐겨찾기