2017-10-20 100 views
2

我最近发现一篇文章说,使用[unowned self]始终是安全的,只要您将订阅添加到DisposeBag并且它位于视图控制器内。RxSwift:当类有disposeBag属性时,总是使用[unowned self]是否安全?

假设我有一个视图控制器,其中deinit不会被调用,由于很强的借鉴意义:

class ViewController: UIViewController { 

    @IBOutlet weak var searchBar: UISearchBar! 
    @IBOutlet weak var tableView: UITableView! 

    private let disposeBag = DisposeBag() 
    private var results = Variable<[Item]>([]) 
    private var searchText = Variable("") 
    var selectedCompletion: ((Item) -> Void)! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     results.asObservable() 
      .bind(to: tableView.rx.items(cellIdentifier: "CustomCell", cellType: CustomCell.self)) { row, item, cell in 
       cell.configure(with: item) 
      } 
      .disposed(by: disposeBag) 

     tableView.rx.itemSelected 
      .subscribe(onNext: { ip in 
       self.selectedCompletion(self.results.value[ip.row]) 
       self.navigationController?.popViewController(animated: true) 
      }) 
      .disposed(by:disposeBag) 

     searchBar.rx.text 
      .debounce(0.6, scheduler: MainScheduler.instance) 
      .subscribe(onNext: { searchText in 
       if searchText == nil || searchText!.isEmpty { return } 
       self.search(query: searchText!) 
      }) 
      .disposed(by: disposeBag) 
    } 

    private func search(query: String) { 
     // Search asynchronously 
     search(for: query) { response in 

      // Some logic here... 
      self.results.value = searchResult.results 
     } 
    } 
} 

我应该仅仅是能够在我的订阅倒闭申报[unowned self],而不必担心我的应用程序崩溃selfnil

当我感到困惑的是,由于搜索是异步的,并不意味着self可以nil如果查询完成之前的ViewController已经弹出导航堆栈?

或者disposeBag会先解除分配,并且关闭不会完成?

关于如何知道类是否拥有闭包的任何说明都会很棒。

回答

0

根据我的经验,使用unowned与处理袋是安全的方法,除了一个块 - onDisposed。出现这种情况时,应用程序因unowed关键字而崩溃 - >weak在此处很有用。

相关问题