在后台线程中将数据保存到域时崩溃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
- 通过套接字从服务器检索同步的联系人数据
- 在后台线程中更新数据库中的应用程序用户
- 在后台线程中更新数据库中的同步状态,并在进程通过委托通知我的控制器之后更新
我在这里干什么 像这样做:
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操作。但是,我们需要注意特定线程中属性的范围,但在主队列上执行这些操作不应该是一项任务。