【问题标题】:Modify Realm Object from background thread cannot update on main thread immeditly从后台线程修改领域对象不能立即在主线程上更新
【发布时间】:2017-07-20 06:10:22
【问题描述】:

从后台线程修改领域对象不能立即在主线程上更新 我的代码是这样的:

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
    }
}

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

【问题讨论】:

    标签: multithreading background realm


    【解决方案1】:

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

    在主 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 Notifications 而不是在发生更改时收到通知。
    • 我会试试 realm.refresh()。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多