Multithreading 从后台线程修改域对象无法在主线程上立即更新
从后台线程修改域对象无法在主线程上立即更新 我的代码如下:Multithreading 从后台线程修改域对象无法在主线程上立即更新,multithreading,background,realm,Multithreading,Background,Realm,从后台线程修改域对象无法在主线程上立即更新 我的代码如下: class demo: NSObject { var mail: OutMailModel? func demotest() { let realm = try! Realm() let mailID = 10001 self.mail = realm.object(ofType: OutMailModel.self,forPrimaryKey: mailID)
class demo: NSObject {
var mail: OutMailModel?
func demotest() {
let realm = try! Realm()
let mailID = 10001
self.mail = realm.object(ofType: OutMailModel.self,forPrimaryKey: mailID)
DispatchQueue.global().async {
let realm = try! Realm()
if let myMail = realm.object(ofType: OutMailModel.self,forPrimaryKey: mailID) {
try! realm.write {
myMail.message = "xxxx"
}
}
DispatchQueue.main.async {
NSLog("mail.message:\(self.mail?.message)") // message not change
}
}
}
}
此事件不起作用:
DispatchQueue.main.async {
let realm = try! Realm()
if let myMail = realm.object(ofType: OutMailModel.self,forPrimaryKey: mailID) {
NSLog("mail.message:\(myMail.message)") // message not changed
}
}
代码出了什么问题?有任何帮助吗?当从后台线程更新领域时,更改可能不可见,因为没有使用新信息更新领域。从: 在主UI线程(或任何具有runloop的线程)上,对象将 在每个线程之间使用其他线程的更改自动更新 运行循环的迭代。在任何其他时间,您都将在 快照,因此单个方法始终可以看到一致的视图,而不会 必须担心在其他线程上发生的事情 您可以调用
realm.refresh()
强制刷新领域:
func demotest() {
...
DispatchQueue.global().async {
let realm = try! Realm()
if let myMail = realm.object(ofType: OutMailModel.self,forPrimaryKey: mailID) {
try! realm.write {
myMail.message = "xxxx"
}
}
realm.refresh();
DispatchQueue.main.async {
NSLog("mail.message:\(self.mail?.message)") // message not change
}
}
}
您应该告诉他使用
notificationToken
和领域通知,而不是在发生更改时通知他。我将尝试Realm.refresh()。非常感谢。