RxSwift:当类有disposeBag属性时,总是使用[unowned self]是否安全?
问题描述:
我最近发现一篇文章说,使用[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
会先解除分配,并且关闭不会完成?
关于如何知道类是否拥有闭包的任何说明都会很棒。
答
根据我的经验,使用unowned
与处理袋是安全的方法,除了一个块 - onDisposed
。出现这种情况时,应用程序因unowed
关键字而崩溃 - >weak
在此处很有用。