完成处理程序中的领域对象:'Realm accessed from incorrect thread.'



我正在开发一个SDK,它主要编写隐藏API调用的包装方法,并在完成处理程序:中返回数据对象

public static func getDogs(token: String?, completionhandler: @escaping (Int?, [Dog]?) -> Void) {
}

狗是境界对象:

public class Dog: Object {
@objc public dynamic var name: String?
@objc public dynamic var age: Int = 0
}

现在,当我试图在呼叫中访问Dogs以获取Dogs时,

getDogs(token: token) { status, dogs in
\ Access Dog[0]
}

不出所料,我得到了RealmException:

***由于未捕获的异常"RLMException"而终止应用程序,原因:"从不正确的线程访问Realm。">

现在,我如何在完成处理程序中传递这样一个Realm对象列表,并在以后访问它而不出现此异常?我知道ThreadSafeReference,但我不希望最终用户在使用SDK之前阅读第三方依赖性手册。这里的最佳实践应该是什么?显然,我无法发送Realm对象的列表。此外,从独立框架的设计考虑,我不应该认为我们的最终用户应该知道Realm apriori。境界的支持应该是好的,而不是最重要的。

我的另一个选择是保留同一数据模型的两个副本:一个普通对象和一个Realm对象。但这将增加解析时间。

如Realm文档中所述:

RLMRealm、RLMRResults或RLMArray的实例或RLMObject的托管实例是线程受限的,这意味着它们只能在创建它们的线程上使用,否则会引发异常

为了避免此异常,您应该在每次需要时创建一个Realm实例,并确保使用自动释放池来释放它。

// Query and update from any thread
autoreleasepool {
let realm = try! Realm()
let theDog = realm.objects(Dog.self).filter("age == 1").first
try! realm.write {
theDog!.age = 3
}
}

最新更新