#ios #corestore
Вопрос:
После использования transaction.deleteAll
внутри асинхронного я больше не получаю никаких ListObjectObserver
событий.
Поэтому в следующем фрагменте кода после извлечения любой новой страницы из API я добавляю новые элементы в базу данных. Но как только мне нужно перезапустить разбиение на страницы со страницы 1, я хочу удалить все избыточные данные (это контролируется флагом forceRefresh). Эта операция, похоже, выполняется успешно, что означает, что я получаю listMonitorDidChange
вызов обратного вызова, который меня интересует. Но все последующие вставки с данными новых страниц больше не вызывают никаких ListObjectObserver
обратных вызовов.
Мне нужен какой-то намек, чтобы выяснить, что может вызвать проблему, потому что до сих пор я очень расстроен этим. Большое спасибо!
Database.stack.выполнить( асинхронно: { транзакция -gt; (Состояние синхронизации, [Пользователь]?) в
var modified: Bool = false var r_users: [User] = [] // For all successful results. let apiUsers: [APIMinimalUserProfile] = apiResponse.users.values() for apiUser in apiUsers { // UPDATE: User exists already by Id. if let t_user: User = try! transaction.fetchOne(by: apiUser.id) { // User get's update. let result = t_user.update(from: apiUser, in: transaction) if case .done = result { modified = true } else if case .failed(_) = result { t_user.refreshAndMerge() } // Return this instance. r_users.append(t_user) } else { // CREATE: User not exists yet. let (result, t_user) = User.make(from: apiUser, in: transaction) if case .done = result, let t_user = t_user { modified = true // Return this instance. r_users.append(t_user) } } } if (forceRefetch) { // if `forceRefetch` is true then we delete all but the first page items var ids = r_users.map { $0.id } ids.append(me.user.id) if try transaction.deleteAll(Fromlt;Usergt;(), notIn: ids) gt; 0 { modified = true } } return (modified ? .ok : .notModified, r_users) }, success: { status, r_users in self.workerQueue.async { // Try store header data for later If-Modified-Since and If-None-Match requests. Or remove stored data if no suitable headers are present. try? self.record(ConditionalHeaders(headers), for: requestId) // Pass the objects as is, they have to be refetched before using them outside the transaction. completeResponse(status, r_users, apiResponse.total) } }, failure: { error in print(error) self.workerQueue.async { completeResponse(.failure(error), nil, apiResponse.total) } } )