从后台线程修改Realm对象无法立即在主线程上更新

时间:2017-07-20 06:10:22

标签: multithreading background realm

从后台线程修改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)
        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
    }
}

代码有什么问题?有人帮忙吗?

1 个答案:

答案 0 :(得分:2)

从后台线程更新领域时,更改可能不可见,因为领域未使用新信息进行更新。来自docs

  

在主UI线程(或任何带有runloop的线程)对象上   自动更新每个之间的其他线程的更改   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 
        }
    }

}