Что произойдет, если я помещу блок Dispatch.main.async в Dispatch.global.async?

У меня есть случай, когда я сохраняю данные в базе данных 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 ()) данные, в соответствии с моим пониманием, почему он иногда отправляет мне меньше данных

К статическим методам RealmManager getDataFromRealm () при выборке данных не применяется фильтр.

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

    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)» в данные, что, очевидно, требует времени.

Почему в вышеуказанных случаях это работает по-другому?

Все ваши вызовы области, вероятно, отнимают много времени, что означает, что ваша выборка инициируется до завершения сохранения.

Rakesha Shastri 16.11.2018 16:07

Являются ли реализации RealmManager.removeDataFromRealm и RealmManager.saveDataToRealm асинхронными или синхронными?

rmaddy 16.11.2018 17:13

@RakeshShastri Я отладил код и в соответствии с точками останова отладки он удаляет данные, затем сохраняет данные, затем извлекает данные ..

Manish Patel 17.11.2018 10:20

@rmaddy Насколько я понимаю, библиотека Realm работает асинхронно. Моя реализация метода синхронна

Manish Patel 17.11.2018 10:30

RealmManager.saveDataToRealm (данные) - это асинхронная функция? Я имею в виду, что внутри saveDataToRealm любая операция выполняется асинхронно?

Mihir Mehta 19.11.2018 06:54

Блок Dispatch.main.async внутри блока async используется для выполнения операций в основном потоке. поэтому в соответствии с этим вы получаете данные асинхронно, а затем, когда вы хотите отображать данные в пользовательском интерфейсе, используйте основной поток. Если вы по-прежнему сталкиваетесь с проблемой, значит, проблема с запросом на получение. В запросе должно быть какое-то ограничение, проверьте его подробно.

Anas Sabir 19.11.2018 07:50

@mihirmehta Их нет асинхронных операций внутри RealmManager.saveDataToRealm (data), но я сомневаюсь в методе записи Realm lib

Manish Patel 19.11.2018 12:00

@AnasSabir Я не думаю, что есть проблема с ограничением запросов, потому что какое-то время я получаю все данные А об асинхронном коде весь мой код внутри функции области синхронизируется, но я сомневаюсь в методах области, которые синхронизируются или асинхронны

Manish Patel 19.11.2018 12:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
565
1

Ответы 1

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

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

Пожалуйста, проверьте мой отредактированный вопрос, я ценю ваш ответ Спасибо

Manish Patel 19.11.2018 06:49

Другие вопросы по теме