Кажется! Я перепробовал все, но не могу сделать.
Я получаю данные из базы данных через каждые 2 мяты и публикую данные в API. И мое приложение зависает на несколько секунд через каждые 2 мяты. Причина в том, что когда я получаю данные из базы данных, приложение зависает. Я должен сделать в фоновом режиме.
Это мой код работает, но приложение застряло
func getObjects(type: Object.Type) -> Results<Object>? {
//... *****************************
//...code is working but app is stuck
return realm.objects(type)
}
if let list = realm.getObjects(type: AssignedCalendars.self)?.filter("isRemove == \(true) AND isSynced == \(false)").toArray(ofType: AssignedCalendars.self) {
if list.count > 0 {
list.forEach({ (calendar) in
let calendar_json = [APIKey.event_id : calendar.event_id, APIKey.offlineId: calendar.offlineId, APIKey.calendar_id: calendar.calendar_id.toArray(ofType: Int.self)] as [String: Any]
removedCalendars.append(calendar_json)
})
}
offlineRemovedCalendars.append(contentsOf: list)
eventData[APIKey.calendar_removelist] = removedCalendars
}
TRY 1. ПОПРОБУЙТЕ для запуска кода в фоновом режиме, я должен попытаться использовать очередь отправки
func getObjects(type: Object.Type) -> Results<Object>? {
//... *****************************
//...code is working but app is stuck
return realm.objects(type)
}
DispatchQueue.main.async(execute: {
if let list = realm.getObjects(type: AssignedCalendars.self)?.filter("isRemove == \(true) AND isSynced == \(false)").toArray(ofType: AssignedCalendars.self) {
DispatchQueue.global().async {
if list.count > 0 {
list.forEach({ (calendar) in
let calendar_json = [APIKey.event_id : calendar.event_id, APIKey.offlineId: calendar.offlineId, APIKey.calendar_id: calendar.calendar_id.toArray(ofType: Int.self)] as [String: Any]
removedCalendars.append(calendar_json)
})
}
offlineRemovedCalendars.append(contentsOf: list)
eventData[APIKey.calendar_removelist] = removedCalendars
} //.. end bac que
}
})//... main que
TRY 2. использовать область в фоновом режиме, но я не знаю, как использовать этот метод
extension Realm {
func writeAsync<T : ThreadConfined>(obj: T, errorHandler: @escaping ((_ error : Swift.Error) -> Void) = { _ in return }, block: @escaping ((Realm, T?) -> Void)) {
let wrappedObj = ThreadSafeReference(to: obj)
let config = self.configuration
DispatchQueue(label: "background").async {
autoreleasepool {
do {
let realm = try Realm(configuration: config)
let obj = realm.resolve(wrappedObj)
try realm.write {
block(realm, obj)
}
}
catch {
errorHandler(error)
}
}
}
}
}
TRY 3. Нашел одно решение, но оно не работает. это не выполнено хорошим способом. Это метод ДОБАВИТЬ, а не получить
var usersRef: ThreadSafeReference<Results<User>>?
DispatchQueue.global().async {
autoreleasepool{
let realm = try! Realm()
try! realm.write {
realm.add(users)
}
usersRef = ThreadSafeReference(to: users)
}
}