1

リモート 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 がまだブロックされているためです。

4

1 に答える 1

3

これに変更してみてください...

[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"];
    }
}];

あまりにも多くのコンテキストを作成して保存しようとしていると思いますが、これがクラッシュの原因になっている可能性がありますか?

また、あなたが得ているクラッシュは何ですか?

于 2013-06-10T11:07:41.530 に答える