2017-10-20 141 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在此處很有用。

相關問題