CoreData — обновление атрибутов без запроса данных или NSBatchUpdateRequest
Для изменения какого либо атрибута какой нибудь сущности мы обычно получаем ее из базы данных, изменяем атрибут и затем снова записываем, используя managedObjectContext. Но представьте ситуацию, что вам надо изменить тысячу объектов в базе данных CoreData… Или десять тысяч…
Вышеупомянутый подход сработает и с миллионом записей в базе данных, однако вы же понимаете, что он абсолютно не дружественнее к ресурсам системы, и времени, которое будет затрачено на выполнение обработки.
Начиная с iOS 8, Apple представила так называемые пакетные обновления (batch update) для базы данных CoreData. Создавая экземпляр класса NSBatchUpdateRequest, мы указываем сущность, атрибут которой хотим обновить, и собственно сам атрибут с обновляемым значением. Пример ниже:
// //proSwift.ru // Изменение атрибутов в базе данных, без получения сущностей. let batchUpdate = NSBatchUpdateRequest(entityName: "SomeEntity") batchUpdate.propertiesToUpdate = ["someBoolProperty": NSNumber(bool: true)] batchUpdate.affectedStores = coreDataStack.context.persistentStoreCoordinator!.persistentStores batchUpdate.resultType = .UpdatedObjectsCountResultType do { let batchResult = try coreDataStack.context.executeRequest(batchUpdate) as! NSBatchUpdateResult print("Записи обновлены \(batchResult.result!)") } catch let error as NSError { print("не могу изменить \(error.localizedDescription)") }
Добавить комментарий