问题描述
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
为零而崩溃,那么这就是您的问题。