完成处理程序中的领域对象:“从错误的线程访问的领域。”

我正在开发一个SDK,该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
}

现在,当我尝试在调用getDogs的过程中访问Dogs时,

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

按预期,我收到了RealmException:

  

***由于未捕获的异常“ RLMException”而终止应用程序,原因:“从错误的线程访问了领域。”

现在,如何在完成处理程序中传递此类Realm对象列表,并在以后获得它的情况下进行访问?我知道ThreadSafeReference,但我不希望最终用户在使用SDK之前先阅读第三方依赖的手册。这里最好的做法是什么?显然,我无法发送Realm对象的列表。同样从独立框架的设计考虑,我不应该假定我们的最终用户应该了解Realm apriori。领域支持应该很好,而不是最重要。

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

zzzz1287 回答:完成处理程序中的领域对象:“从错误的线程访问的领域。”

Realm documentation中所述:

  

RLMRealm,RLMResults或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
    }
}
本文链接:https://www.f2er.com/3125589.html

大家都在问