从Singleton

时间:2016-11-08 20:08:05

标签: swift multithreading realm

这不是一个重复的问题,请继续阅读!

我在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,有人遇到同样的问题吗?

1 个答案:

答案 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也可以在内部提供正确的实例。