Сохранение записей в фоновом режиме вызывает сбой и по-прежнему блокирует пользовательский интерфейс

Я получаю ответ от удаленного 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"];
    }
}];

Я полагаю, что он пытается создать и сохранить слишком много контекстов, что, возможно, вызывает сбой?

Кроме того, что крушение вы получаете?

Другие вопросы по тегам