我正在尝试使用Realm库将数据持久保存在我的应用程序中。但是,我一直遇到相同的错误代码:“从错误的线程访问领域”。我尝试通过创建特定于领域的调度队列并将所有我的Realm调用包装在其中来解决此问题。
这是我的“ RealmManager”类现在的样子:
import Foundation
import RealmSwift
class RealmManager {
fileprivate static let Instance : RealmManager = RealmManager()
fileprivate var _realmDB : Realm!
fileprivate var _realmQueue : DispatchQueue!
class func RealmQueue() -> DispatchQueue {
return Instance._realmQueue
}
class func Setup() {
Instance._realmQueue = DispatchQueue(label: "realm")
Instance._realmQueue.async {
do {
Instance._realmDB = try Realm()
} catch {
print("Error connecting to Realm DB")
}
}
}
class func saveObjectArray(_ objects: [Object]) {
Instance._realmQueue.async {
do {
try Instance._realmDB.write {
for obj in objects {
Instance._realmDB.add(obj, update: .all)
}
}
} catch {
print("Error Saving Objects")
}
}
}
class func fetch(_ type: Int) -> [Object] {
if let realm = Instance._realmDB {
let results = realm.objects(Squeak.self).filter("type = \(type)")
var returnArray : [Object] = []
for r in results {
returnArray.append(r)
}
return returnArray
}
return []
}
我正在didFinishLaunchingWithOptions内部调用Setup()来实例化Realm队列和Realm Db实例。
我在saveObjectArray中获得错误代码:
try Instance._realmDB.write { }
这似乎只是我对Realm线程要求的误解。如果您对此事有任何见解,或者从这里进入方向,我将不胜感激。
此问题是,您在与保存数据不同的线程上获取Realm数据。
要解决该错误,fetch
中的代码也将需要在您创建的Realm线程上运行。
[我认为this的文章很好地解释了Realm中的多线程,特别建议注意本文中概述的三个规则。