尝试更新领域对象,但出现错误-从不正确的线程访问领域,您能帮我吗?如何解决?
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
的情况下尝试,但收到相同的错误
答案 0 :(得分:0)
为了保持一致性,应从同一线程处理诸如特定Realm实例之类的问题。 docs中对此进行了介绍。您可以通过以下方式实现它:
,方法是填充新的thread并在其中执行所有Realm调用。当然,您首先需要为此线程配置runloop。
通过创建专用的调度队列(我猜是更好的串行方式),然后再次执行此队列中的所有Realm调用。
对于这两种方式,您都必须编写某种将在内部使用专用线程/队列的包装器/协调器。该包装器将在其中包含Realm的实例,因此您不会在viewWillAppear
方法中包含它,这本身并不是一个好主意。
如果要为每个线程创建不同的Realm实例,请阅读我前面提到的文档中的“跨线程传递实例”一节。