一旦从另一个线程获得结果,如何更新领域对象?

时间:2018-03-06 11:57:10

标签: swift multithreading realm

如何更新领域对象t#1。

问题是requestAuthorization调用需要依赖于结果,这会产生一个单独的线程。

使用DispatchQueue.main.async没有帮助。

@IBAction func notificationToggle(_ sender: UISwitch) {

        if (sender.isOn){
            //Notifications being turned on


            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
                (granted, error) in

                print("Permission granted: \(granted)")

                if granted{
                    myRealmObject.generateNotificationItems() //#1. Throws error due to not being in the main thread
                }
                else{
                    self.showNotificationsPrompt()
                }
            }
        }
        else{
            myRealmObject.deleteNotificationItems() //#2. This is fine, being in the main thread.
        }
    }

1 个答案:

答案 0 :(得分:0)

您可以使用ThreadSafeReference跨线程传递Realm对象,如下所述:https://realm.io/docs/swift/latest/#passing-instances-across-threads

@IBAction func notificationToggle(_ sender: UISwitch) {

    if (sender.isOn){
        //Notifications being turned on

        let objectRef = ThreadSafeReference(to: myRealmObject)

        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
            (granted, error) in
            autoreleasepool {
                print("Permission granted: \(granted)")

                if granted{
                    let realm = try! Realm()
                    guard let obj = realm.resolve(objectRef) else { return }

                    obj.generateNotificationItems()
                }
                else{
                    self.showNotificationsPrompt()
                }
            }
        }
    }
    else{
        myRealmObject.deleteNotificationItems() //#2. This is fine, being in the main thread.
    }
}