У меня есть случай, когда я сохраняю данные в базе данных 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)» в данные, что, очевидно, требует времени.
Почему в вышеуказанных случаях это работает по-другому?
Являются ли реализации RealmManager.removeDataFromRealm и RealmManager.saveDataToRealm асинхронными или синхронными?
@RakeshShastri Я отладил код и в соответствии с точками останова отладки он удаляет данные, затем сохраняет данные, затем извлекает данные ..
@rmaddy Насколько я понимаю, библиотека Realm работает асинхронно. Моя реализация метода синхронна
RealmManager.saveDataToRealm (данные) - это асинхронная функция? Я имею в виду, что внутри saveDataToRealm любая операция выполняется асинхронно?
Блок Dispatch.main.async внутри блока async используется для выполнения операций в основном потоке. поэтому в соответствии с этим вы получаете данные асинхронно, а затем, когда вы хотите отображать данные в пользовательском интерфейсе, используйте основной поток. Если вы по-прежнему сталкиваетесь с проблемой, значит, проблема с запросом на получение. В запросе должно быть какое-то ограничение, проверьте его подробно.
@mihirmehta Их нет асинхронных операций внутри RealmManager.saveDataToRealm (data), но я сомневаюсь в методе записи Realm lib
@AnasSabir Я не думаю, что есть проблема с ограничением запросов, потому что какое-то время я получаю все данные А об асинхронном коде весь мой код внутри функции области синхронизируется, но я сомневаюсь в методах области, которые синхронизируются или асинхронны





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