Что произойдет, если я поместу блок Dispatch.main.async в Dispatch.global.async? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть случай, когда я сохраняю данные в базе данных Realm в Dispatch.global в фоновом потоке, а затем в том же потоке, который я назвал Dispatch.main.async для извлечения данных из Realm и обновления данных UITableView.

Проблема в том, что я получаю меньше данных (data.count). Предположим, что общее количество данных равно 10, тогда иногда я получаю все данные, иногда меньше 10.

Почему это происходит, помогите мне понять это ..

следующий пример кода

func getData(data: [String]) {
    DispatchQueue.global(qos: .background).async {
        RealmManager.removeDataFromRealm()
        RealmManager.saveDataToRealm(data)
        Dispatch.main.async {
            let dataFromRealm = RealmManager.getDataFromRealm()
            self.sendDataToUI(dataFromRealm)
        }
    }
}

В приведенном выше коде removeDataFromRealm (), saveDataToRealm (data), getDataFromRealm () являются статическими функциями класса области, в которых я сохраняю, удаляю, получаю данные из базы данных области

Я отлаживал код со всех аспектов, которые я понимаю, и он сохраняет (saveDataToRealm (data)) все данные, а затем извлекает (getDataFromRealm ()) данные в соответствии с моим пониманием, почему он отправляет мне меньшее количество данные иногда

Нет фильтра, применяемого к статическим методам getDataFromRealm () RealmManager при получении данных.

Предположим, что приведенный выше код переходит в состояние гонки, что происходит в приведенном ниже фрагменте кода

    func getImageFromServer (url: URL) {
        DispatchQueue.global(qos: .background).async {
            do {
                let data = try Data(contentsOf: url)
                DispatchQueue.main.async {
                    self.imageView.image = UIImage(data: data)
                }
            }catch {
                print(error)
            }
        }
    }

Поскольку getImageFromServer () сначала извлекает данные, затем выполняется Dispatch.main.async после преобразования «Data (contentsOf: url)» в данные, которые, очевидно, занимают много времени.

Пожалуйста, помогите мне понять, почему это работает по-разному в вышеуказанных случаях ... Заранее спасибо

1 Ответ

0 голосов
/ 19 ноября 2018

Если ваши RealmManager.removeDataFromRealm() и / или RealmManager.saveDataToRealm(data) являются асинхронными, то вы попали в состояние гонки здесь, поскольку ничто не гарантирует, что ваши данные будут сохранены до выполнения кода в DispatchQueue.main. Что вы можете сделать, это использовать DispatchGroup, чтобы дождаться завершения двух указанных выше методов, прежде чем вводить DispatchQueue.main.async.

Чтобы ответить на вопрос в заголовке, если вы находитесь в глобальной очереди и затем выполняете коды в глобальной очереди, то Swift, по сути, переключается с первого на второе.

...