在后台线程中将数据保存到 Realm 数据库时崩溃.|苹果 |斯威夫特 4.2.


DispatchQueue.global(qos: .background).async {
                    RccContactController.shared.updateDbForAppUsers(contactModels: contacts)
                  }
DispatchQueue.global(qos: .background).async {
                    RccContactController.shared.updateSyncStatus(lastCount : lastIndex)
                    DispatchQueue.main.async {
                        ContactDataStore.shared.updateContacts(withAppUsers: contacts)
                        if let safeDelegate = RccContactController.shared.delegate {
                            safeDelegate.syncedPhonebookContact(contacts: restContacts, appUsers: cont)
                        }
                    }
                }

上面发生了什么:

  • 通过套接字从服务器检索同步的联系人数据
  • 在后台线程中更新数据库中的应用程序用户
  • 在后台线程中更新数据库中的同步状态,并在进程通过委托通知我的控制器之后更新。

有时我在第二个线程中遇到崩溃。

从 com.apple.main-thread 排队(线程 1(

我在这里做错了什么?

这样做:

  DispatchQueue(label: "background").async {
    RccContactController.shared.updateSyncStatus(lastCount : lastIndex)                              
    ContactDataStore.shared.updateContacts(withAppUsers: contacts)
    DispatchQueue.main.async {
        if let safeDelegate = RccContactController.shared.delegate {
            safeDelegate.syncedPhonebookContact(contacts: restContacts, appUsers: cont)
        }
    }
}

一般示例:

  DispatchQueue(label: "background").async {
    do {
        let realm = try Realm(configuration: config)
        let obj = realm.resolve(wrappedObj)
        try realm.write {
            DispatchQueue.main.async {
                //Callback or Update UI in Main thread
            }
        }
    }
    catch {
        //Callback or Update UI in Main thread
    }
}

仅执行 UI 操作DispatchQueue.main.async其余部分保留在后台线程中。

最新更新