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()。非常感谢。