这不是一个重复的问题,请继续阅读!
我在DispatchQueue中使用RealmBackend
单例时,显示“'RLMException',原因:'从错误的线程访问的域''错误消息。
这是我的班级:
class RealmBackend {
static let shared = RealmBackend()
var realm = try? Realm()
}
其中有一些功能,如addObject()
,正在访问realm.commitWrite()
和realm.beginWrite()
功能。
现在我使用addObject
从回调(UIRefreshControl
)调用DispatchQueue.main.sync
函数,因为我假设Realm对象是在main
线程上创建的(I在Github上的某处读取你需要相同的线程来实例化和访问Realm()
值。
正如我之前所说,我总是得到RLMException
,有人遇到同样的问题吗?
答案 0 :(得分:2)
Realm
个实例是线程限制的,这意味着它们只能在创建它们的线程上工作。如果您尝试在线程之间传递实例,那么您将获得所见的错误线程异常。这是通过设计来完成的,以保证Realm的ACID合规性。
保持对Realm
个实例的硬引用并不是很重要,特别是在单例对象中。一旦创建了特定线程的Realm
实例,Realm将在内部保留该引用,如果您尝试创建一个具有相同设置的新实例,它将简单地重新提供它。因此,多次调用Realm()
的开销非常小。
如果您需要使用与默认Realm配置不同的Realm
实例,Configuration
对象是线程安全的,因此您只需存储一个引用即可,并将其传递给{ {1}}只要你需要它。
Realm()
在这种情况下,由于class RealmBackend {
static let shared = RealmBackend()
// A Configuration for a Realm in the caches directory
let cacheConfiguration = Realm.Configuration(
fileURL: URL(fileURLWithPath: /* Path to the Realm in Caches */),
readOnly: true)
func addObject() {
let cacheRealm = try! Realm(configuration: cacheConfiguration)
// ... add object to cacheRealm
}
func getObject() -> Object {
let cacheRealm = try! Realm(configuration: cacheConfiguration)
let object = realm.objects(Object.self).first
return object
}
}
是按需创建的,即使在单独的线程上调用单例方法,Realm也可以在内部提供正确的实例。