Сбой при сохранении данных в Realm в фоновом потоке.|iOS |Swift 4.2 - PullRequest
0 голосов
/ 12 апреля 2019
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)

Что я тут не так делаю?

1 Ответ

1 голос
/ 12 апреля 2019

Делай так:

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

Выполнять только операцию пользовательского интерфейса в DispatchQueue.main.async в остальном держать в фоновом потоке.

...