在后台线程中将数据保存到域时崩溃iOS | Swift 4.2

在后台线程中将数据保存到域时崩溃iOS | Swift 4.2,ios,swift,multithreading,realm,Ios,Swift,Multithreading,Realm,上面发生了什么: 通过套接字从服务器检索同步的联系人数据 在后台线程中更新数据库中的应用程序用户 在后台线程中更新数据库中的同步状态,并在进程通过委托通知我的控制器之后更新 有时我在第二个线程中遇到崩溃 从com.apple.main-thread排队(线程1) 我在这里干什么 像这样做: DispatchQueue.global(qos: .background).async { RccContactController.shared.updateD

上面发生了什么:

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

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


我在这里干什么

像这样做:

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)
                        }
                    }
                }
  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.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)
                        }
                    }
                }
  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.main.async中执行UI操作,其余部分保留在后台线程中。

谢谢。另外,如果我在两个不同的后台线程中编写与上面发布的相同的代码,这有关系吗?没关系。我们可以使用multiples操作编写多个后台队列。我的实现与您的建议之间的唯一区别是,您将以下语句放在了主线程之外。ContactDataStore.shared.updateContacts(withAppUsers:contacts)然而,我用它执行一些依赖于用户界面的任务,因此我使用了前一种方法。现在,我已经从整个块中完全删除了这个方法调用。我想知道这是否是唯一的问题,因为这次坠机非常罕见。你能帮我解决这个问题吗。同样的问题:Realm在内部使用CoreData,Apple声明应在主队列上执行数据库持久数据存储(添加、更新)。@AnkitJayaswal不同意,但您从何处获得该信息?我很好奇。此外,Realm在后台队列上也可以很好地工作-请参阅文档和。你可能也想看看。是的!!这就是我在这里要做的。使用后台队列执行我的CRUD操作。但是,我们需要注意特定线程中属性的范围,但在主队列上执行这些操作不应该是一项任务。