从不正确的线程访问swift领域

时间:2019-07-11 18:14:26

标签: swift realm

尝试更新领域对象,但出现错误-从不正确的线程访问领域,您能帮我吗?如何解决?

var objectsArray: Results<BankHistoryRealm> {
    get {
        return dbHistoryRealm.getArray()
    }
}

override func viewWillAppear(_ animated: Bool) {
    let realm = try! Realm()
    dbHistoryRealm.realm = realm
    objectsArray.forEach { (match) in
        all.append(match)
    }
    all.forEach { (match) in
            UserNetwork.get(from: match.from, 
                            to: match.to, 
                            match_id: match.match_id, 
                            completion: { (isSuccess, info) in // get info from server

                    DispatchQueue.main.async { // trying without. but get the same error
                        do {
                            let isCorrect = self.isCorrect(match: match, info: info)
                            self.updateValue(match: match)
                            self.dbHistoryRealm.update(ofType: match, 
                                                       value: isCorrect as AnyObject, 
                                                       key: "isCorrect")

                        }catch {
                        }
                    }
            }
     }
}

在没有DispatchQueue.main.async的情况下尝试,但收到相同的错误

1 个答案:

答案 0 :(得分:0)

为了保持一致性,应从同一线程处理诸如特定Realm实例之类的问题。 docs中对此进行了介绍。您可以通过以下方式实现它:

  • ,方法是填充新的thread并在其中执行所有Realm调用。当然,您首先需要为此线程配置runloop。

  • 通过创建专用的调度队列(我猜是更好的串行方式),然后再次执行此队列中的所有Realm调用。

对于这两种方式,您都必须编写某种将在内部使用专用线程/队列的包装器/协调器。该包装器将在其中包含Realm的实例,因此您不会在viewWillAppear方法中包含它,这本身并不是一个好主意。

如果要为每个线程创建不同的Realm实例,请阅读我前面提到的文档中的“跨线程传递实例”一节。