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]
,而不必擔心我的應用程序崩潰self
是nil
。
當我感到困惑的是,由於搜索是異步的,並不意味着self
可以是nil
如果查詢完成之前的ViewController已經彈出導航堆棧?
或者disposeBag
會先解除分配,並且關閉不會完成?
關於如何知道類是否擁有閉包的任何說明都會很棒。