[英]How does DispatchQueue.main.async store it's blocks
我有一个类似的代码:
func fetchBalances() -> Observable<Result<[User], Error>> {
Observable.create { observer in
var dataChangeDisposable: Disposable?
DispatchQueue.main.async {
let realm = try! Realm()
let user = realm.objects(UserData.self)
dataChangeDisposable = Observable.collection(from: user)
.map { $0.map { UserData.convert($0) } }
.subscribe(onNext: {
observer.onNext(.success($0))
})
}
return Disposables.create {
dataChangeDisposable?.dispose()
}
}
}
我需要使用一些带有运行循环的线程来维护对 Realm 数据库的订阅(Realm 的限制)。 现在我正在使用 DispatchQueue.main.async {} 方法,我注意到订阅一直保持活动状态,DispatchQueue.main 如何存储它提交的块,如果 Observable 销毁是否意味着我在内存中泄漏块?
发送到调度队列的块在执行后立即被删除。 它根本不会存储很长时间。
如果您的订阅“一直有效”,那是因为它没有被正确处理。 可能这里发生的事情是发送到Disposables.create
的块在dataChangeDisposable
包含值之前被调用。
通过将代码更改为以下内容来测试我的假设:
return Disposables.create {
dataChangeDisposable!.dispose()
}
如果您的应用程序因为dataChangeDisposable
为零而崩溃,那么这就是您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.