Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios DispatchQueue.main.async如何存储它';s块_Ios_Swift_Realm_Rx Swift - Fatal编程技术网

Ios DispatchQueue.main.async如何存储它';s块

Ios DispatchQueue.main.async如何存储它';s块,ios,swift,realm,rx-swift,Ios,Swift,Realm,Rx Swift,我有一个类似的代码: func fetchBalances() -> Observable<Result<[User], Error>> { Observable.create { observer in var dataChangeDisposable: Disposable? DispatchQueue.main.async { let realm = try! Realm()

我有一个类似的代码:

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()
        }
    }
}
func fetchBalances()->可观察{
创建{observate in
var DataChangeDispossible:一次性?
DispatchQueue.main.async{
让realm=try!realm()
让user=realm.objects(UserData.self)
dataChangeDisposable=可观察的集合(来自:用户)
.map{$0.map{UserData.convert($0)}
.订阅(onNext:{
observer.onNext(.success($0))
})
}
归还一次性物品。创建{
DataChangeDispose?.dispose()
}
}
}

我需要使用一些带有运行循环的线程来维护对领域数据库的订阅(领域的限制)。现在我正在使用DispatchQueue.main.async{}方法,我注意到订阅一直处于活动状态,DispatchQueue.main如何存储它提交的块,如果Observable destroys,是否意味着我正在内存中泄漏块?

发送到调度队列的块在执行后立即被删除。它根本不会储存很长时间

如果你的订阅“一直处于活动状态”,那是因为它没有被正确处理。这里可能发生的情况是发送到
Disposables.create
的块在
datachange disposable
包含值之前被调用

通过将代码更改为:

return Disposables.create {
    dataChangeDisposable!.dispose()
}

如果你的应用程序因为
DataChangeDispossible
为零而崩溃,那么这就是你的问题。

不确定你在问什么,因为这些代码绕过了领域,可能真的会导致很多其他问题;领域对象现在已与领域断开连接,它们不再延迟加载,
user
是一个结果,将包含多个用户,而不仅仅是一个,并且该代码可能会导致对象线程问题。花点时间阅读上的领域文档。在这个用例中,维护订阅意味着什么。你能澄清这个问题吗?@Jay我的意思是,虽然我保持订阅活动,但我仍然从领域获得更新,因此我得出结论,DispatchQueue.main保持我的块活动,并将其存储在内部某个位置,问题是我是否会因为DispatchQueue.main而在内存中泄漏块?公认的答案专门解决了调度队列的处理问题,而这并不是代码的真正问题。您不应该像那样创建对领域数据库的“订阅”,而且您确实不希望通过Swift构造来处理领域结果——这对于较大的数据集来说是灾难性的,而且效率非常低。请通读该链接,了解如何正确使用领域通知,注意此通知始终在其最初注册的线程上传递。该线程必须有一个当前正在运行的运行循环感谢您给我指出代码中的一个错误,我认为Realm需要运行循环来始终传递通知,但是如果dispatch queue在执行后立即删除块,“泄漏”订阅如何从Realm获得通知?我不知道如何使用Realm。我只是想回答一个问题,为什么你的订阅会被正确处理。我建议您创建一个关于如何从领域获取通知的新问题(或者搜索该问题,因为它可能已经得到了回答)