私は最近[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]
を宣言することができると私のアプリからクラッシュを心配する必要はありませんself
はnil
である。私は混乱している
は、検索が非同期であるので、それはself
を意味するものではありません、あるクエリが完了する前のViewControllerは、ナビゲーションスタックからポップされた場合nil
することができますか?
最初にdisposeBag
の割り当てを解除してクロージャが完了しないのですか?
クラスがクロージャを所有しているかどうかを知る方法については、あまりにも良いでしょう。