2017-10-20 3 views
2

私は最近[unowned self]を使用しているという記事が、DisposeBagにサブスクリプションを追加していて、それがビューコントローラの中にある限り、常に安全だという記事を発見しました。RxSwift:クラスにdisposeBagプロパティがある場合、[unowned self]を常に使用するのは安全ですか?

私はdeinitが強い参照に呼び出されていないのViewControllerを持っていると仮定すると:

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を意味するものではありません、あるクエリが完了する前のViewControllerは、ナビゲーションスタックからポップされた場合nilすることができますか?

最初にdisposeBagの割り当てを解除してクロージャが完了しないのですか?

クラスがクロージャを所有しているかどうかを知る方法については、あまりにも良いでしょう。

答えて

0

onDisposedを除き、私の経験ではunownedに処分袋を使用するのは安全な方法です。 unowedキーワード - >weakが原因でアプリがクラッシュした場合があります。

関連する問題