Сохранение записей в фоновом режиме вызывает сбой и по-прежнему блокирует пользовательский интерфейс
Я получаю ответ от удаленного API, анализирую его и назначаю в массиве, затем зацикливаю этот массив для сохранения каждого элемента в сущности:
for (id element in arrayProduct) {
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
Product *product = [Product MR_createInContext:localContext];
([element valueForKey:@"Category Id"] == [NSNull null])?(product.category_id = [NSNumber numberWithInt:-1]):(product.category_id = [NSNumber numberWithInt:[[element valueForKey:@"Category Id"] intValue]]);
}];
}
Код цикла for сохраняется в coredata, но через некоторое время приложение вылетает, а остальные записи прерываются и не сохраняются.
Вот журнал, пока цикл for выполняет сохранение:
2013-06-10 11:54:15:461 App[2718:2311] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:] [Line 42] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1fd88c70) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING
2013-06-10 11:54:15:471 App[2718:2311] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:] [Line 42] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1fd88c70) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING
2013-06-10 11:54:16:099 App[2718:135939] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:] [Line 54] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x20d96320) → Saving <NSManagedObjectContext (0x20d96320): *** UNNAMED ***> on *** BACKGROUND THREAD *
2013-06-10 11:54:16:101 App[2718:96515] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:] [Line 54] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x20d966e0) → Saving <NSManagedObjectContext (0x20d966e0): *** UNNAMED ***> on *** BACKGROUND THREAD *
я использую saveWithBlock:
метод, потому что другие, как метод saveInBackgroundWithBlock:
устарели.
У меня есть несколько вопросов:
-Я должен продолжить цикл for внутри блока, или блок должен быть помещен внутри цикла for? Какой метод я должен использовать, чтобы приложение не зависало? метод сохранения данных в фоновом режиме? потому что пользовательский интерфейс все еще заблокирован во время сохранения.
1 ответ
Попробуйте изменить это на это...
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
for (id element in arrayProduct) {
Product *product = [Product MR_createInContext:localContext];
// ([element valueForKey:@"Category Id"] == [NSNull null]) ? (product.category_id = [NSNumber numberWithInt:-1]):(product.category_id = [NSNumber numberWithInt:[[element valueForKey:@"Category Id"] intValue]]);
// that line of code is really hard to read. Changed it to this...
product.category_id = element[@"Category Id"] == [NSNull null] ? @-1 : element[@"Category Id"];
}
}];
Я полагаю, что он пытается создать и сохранить слишком много контекстов, что, возможно, вызывает сбой?
Кроме того, что крушение вы получаете?