DispatchQueue.main.async如何存储它的块

问题描述

我有类似的代码

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