所以有很多相同的问题,但没有一个帮助我,这就是为什么我再次提出同样的问题, 所以我在访问RealmObject数组时遇到此异常。当我检查类似的问题和Realm的官方网站时,我发现每个问题都有相似的东西
Realm对象不是线程安全的,不能跨线程共享,因此您必须在要读取或写入的每个线程/调度队列中获取Realm实例。
所以我所做的是在访问它之前创建了Realm的新实例
这里有一些片段:
let realm = try! Realm()
try! realm.write {
realm.add(saveUserCredentials, update: true)
}
我在访问领域之前每次创建一个新的实例,就像我在上面所说的那样
我仍然遇到同样的错误然后我试图只在MainThread上访问我的Realm实例,我做了类似的事情:
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)
我非常肯定我正在做的不是正确的做法,并且错误发生的频率不是很高,10次中有1次
任何人都可以指出我为处理此异常而必须做些什么?
答案 0 :(得分:1)
Realm对象不是线程安全的,不能跨线程共享,因此您必须在要读取或写入的每个线程/调度队列中获取Realm实例。
Realm对象表示Realm
,Objects
,Results
,List
和LinkingObjects
。 saveUserCredentials
是Objects
或List
的实例吗?所以你无法通过
saveUserCredentials
跨线程。要解决此问题,您可以按ThreadSafeReference
将其换行,然后在线程中传递它,或者重新获取saveUserCredentials
每个线程以及realm
答案 1 :(得分:0)
由于您的根本关注是如何在Realm中处理线程,您可能会对使用value typed api感兴趣,pros and cons将域对象保留在持久层的边界内。有{{3}}可能适合您的用例。您还可以根据用例在单个项目的不同部分中使用value和realm本机类型。