リモート 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 ループ コードはコアデータに保存されますが、しばらくするとアプリがクラッシュし、残りのエントリが中断されて保存されませんでした。
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 ループ内に配置する必要がありますか? -アプリがクラッシュしないようにするには、どのような方法を使用すればよいですか? メソッドはバックグラウンドでデータを保存していますか? 保存中に UI がまだブロックされているためです。