Swift3 如何处理从错误线程访问的领域?
所以有很多相同的问题,但没有一个对我有帮助这就是为什么我再次问同样的问题, 所以我在访问RealmObject数组时遇到了这个异常。当我查看类似的问题和领域的官方网站时,我发现每个问题都有相似之处 领域对象不是线程安全的,不能跨线程共享,因此您必须在每个线程/调度队列中获取一个领域实例,您要在其中读或写 所以我所做的是在访问它之前创建了新的领域实例 以下是一些片段:Swift3 如何处理从错误线程访问的领域?,swift3,realm,realm-mobile-platform,Swift3,Realm,Realm Mobile Platform,所以有很多相同的问题,但没有一个对我有帮助这就是为什么我再次问同样的问题, 所以我在访问RealmObject数组时遇到了这个异常。当我查看类似的问题和领域的官方网站时,我发现每个问题都有相似之处 领域对象不是线程安全的,不能跨线程共享,因此您必须在每个线程/调度队列中获取一个领域实例,您要在其中读或写 所以我所做的是在访问它之前创建了新的领域实例 以下是一些片段: let realm = try! Realm() try! realm.write {
let realm = try! Realm()
try! realm.write {
realm.add(saveUserCredentials, update: true)
}
每次访问领域之前,我都会创建一个新实例,就像我在上面所说的那样
尽管如此,我还是遇到了同样的错误,然后我尝试只在主线程上访问我的领域实例,我做了如下操作:
if Thread.isMainThread{
let realm = try! Realm()
try! realm.write {
realm.add(saveUserCredentials, update: true)
}
}else{
DispatchQueue.main.async {
let realm = try! Realm()
try! realm.write {
realm.add(saveUserCredentials, update: true)
}
}}
但我还是犯了同样的错误
fatal error: unexpectedly found nil while unwrapping an Optional value libc++abi.dylib: terminating with uncaught exception of type realm::IncorrectThreadException: Realm accessed from incorrect thread. (lldb)
我很确定我所做的不是正确的方法,错误也不是经常发生,十次中只有一次
任何人都可以指出我要做什么来处理这个异常
领域对象不是线程安全的,不能跨线程共享,因此您必须在每个线程/调度队列中获取一个领域实例,您要在其中读或写
领域对象是指领域
,对象
,结果
,列表
和链接对象
saveUserCredentials
是对象的实例
或列表
对吗?所以你不能通过
saveUserCredentials
accross-threads。要解决此问题,您可以通过ThreadSafeReference
包装它,然后跨线程传递它,或者重新获取saveUserCredentials
每个线程以及realm
另请参见,因为您最关心的问题是如何在领域中处理线程,所以您可能会对使用一种将领域对象保持在持久层边界内的方法感兴趣。有一些可能适合您的用例或不适合您的用例。根据您的用例,您还可以在单个项目的不同部分同时使用value和realm本机类型。saveUserCredentials是托管对象吗?它是在什么线程上获得的?@EpicPandaForce您所说的托管对象是什么意思?现在还不清楚它是在哪个线程上获取的,因为我正在调用这个方法
saveUserCredentials()
,它基本上创建了这个saveUserCredentials
对象,我在执行一些异步任务(它们正在执行一些网络请求)之后调用我的方法托管对象意味着它已添加到领域并成为托管代理。然后,它被绑定到您将其添加到的域在其中打开的线程。您可能希望尝试将saveUserCredentials
包装到ThreadSafeReference
中,尽管错误可能更为根本。