Roh*_*hal 31 closures swift rx-swift
我是否需要[weak self]在RXSwift subscribeNext闭包内使用?
我有代码:
searchController.searchBar.rx_text.throttle(0.2, scheduler: MainScheduler.instance).subscribeNext { searchText in
self.viewModel.searchForLocation(searchText)
}.addDisposableTo(DisposelBag.sharedDisposelBag.disposeBag)
Run Code Online (Sandbox Code Playgroud)
我是否需要修改它以便[weak self]在闭包开始时有一个捕获列表?像这样:
searchController.searchBar.rx_text.throttle(0.2, scheduler: MainScheduler.instance).subscribeNext { [weak self] searchText in
self?.viewModel.searchForLocation(searchText)
}.addDisposableTo(DisposelBag.sharedDisposelBag.disposeBag)
Run Code Online (Sandbox Code Playgroud)
zap*_*aph 18
如果闭包不属于您不必使用的类[weak self].
在内联闭包的情况下,闭包不是由类所拥有,而是由它所在的范围所有,并且在保留范围时将被释放.
如果关闭被传递,它可能或可能不属于类(例如属性),并且谨慎使用[weak self]incase它是由类拥有的.
Son*_*yen 14
是的,self如果self在闭包内访问,则应该创建一个弱捕获,并且可能在闭包被调用之前self成为可能nil.
如果一个闭包捕获self然后self变成nil,当调用闭包并尝试访问它时self,你会得到一个例外.
感谢scotteg,他在GitHub上有一个示例项目:https://github.com/scotteg/TestRxSwiftClosures
请参阅DetailViewController示例中的内容.
您可以取消注释其他两个示例,一次一个,以查看结果.第一个根本没有定义捕获列表,第二个定义unowned捕获.运行应用程序并输入一些文本,然后在5秒内点击完成(每个闭包有5秒的延迟).前两个示例将导致抛出异常.
基本规则是:如果可以将捕获(例如self)设置为nil,例如,如果它引用的实例被解除分配,则将捕获定义为weak.否则,如果该封内的封闭和捕捉将始终称呼对方,并在同一时间被释放,定义捕捉为unowned.
| 归档时间: |
|
| 查看次数: |
9777 次 |
| 最近记录: |