Вставка пакета iOS CoreData?
В моем приложении iPhone мне нужно вставить ~ 2000 записей в Core Data, прежде чем пользователь сможет использовать любые функции приложения. Я загружаю записи в CoreData из локального файла JSON. Этот процесс занимает много времени (2,5 + минуты), но нужно только один раз (или открытие каждого приложения ~ 10 для получения обновленных данных).
Есть ли пакетная вставка для Core Data? Как ускорить этот процесс вставки?
Если я не могу ускорить его с использованием Core Data, какие другие рекомендуемые параметры?
Ответы
Ответ 1
Ознакомьтесь с главой Эффективно импортировать данные из руководства по программированию основных данных.
В настоящее время у меня такие же проблемы, как и вы, только я вставляю 10000 объектов, и мне требуется около 30 секунд, что для меня все еще медленное. Я делаю [managedObjectContext save] на каждые 1000 управляемых объектов, вставленных в контекст (другими словами, мой размер партии - 1000). Я экспериментировал с 30 различными размерами партий (от 1 до 10000), и 1000, кажется, является оптимальным значением в моем случае.
Ответ 2
Я искал ответ на аналогичный вопрос, когда я столкнулся с этим. @VladimirMitrovic ответ был полезен в то время, зная, что я не должен сохранять контекст каждый раз, но я также искал пример кода.
Теперь, когда у меня есть это, я предоставлю код ниже, чтобы другие люди могли видеть, как он может выглядеть в пакетной вставке.
// set up a managed object context just for the insert. This is in addition to the managed object context you may have in your App Delegate.
let managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = (UIApplication.sharedApplication().delegate as! AppDelegate).persistentStoreCoordinator // or wherever your coordinator is
managedObjectContext.performBlock { // runs asynchronously
while(true) { // loop through each batch of inserts. Your implementation may vary.
autoreleasepool { // auto release objects after the batch save
let array: Array<MyManagedObject>? = getNextBatchOfObjects() // The MyManagedObject class is your entity class, probably named the same as MyEntity
if array == nil { break } // there are no more objects to insert so stop looping through the batches
// insert new entity object
for item in array! {
let newEntityObject = NSEntityDescription.insertNewObjectForEntityForName("MyEntity", inManagedObjectContext: managedObjectContext) as! MyManagedObject
newObject.attribute1 = item.whatever
newObject.attribute2 = item.whoever
newObject.attribute3 = item.whenever
}
}
// only save once per batch insert
do {
try managedObjectContext.save()
} catch {
print(error)
}
managedObjectContext.reset()
}
}
Ответ 3
Objective-C
Версия для @Suragch anwser
NSManagedObjectContext * MOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
MOC.persistentStoreCoordinator = YOURDB.persistentStoreCoordinator;
[MOC performBlock:^{
// DO YOUR OPERATION
}];