1

私は MagicalRecord ライブラリを使用して、テーブルビューの作成に使用されるいくつかの CoreData オブジェクトをロードしています。これは遅い操作なので、バックグラウンドの脅威でこれを実行しようとしています。これはすべてうまくいっているようで、データが にロードされself.products、しばらくしてから (+- 分)、ロードされたすべてのオブジェクトが<fault>状態になったようです。なぜこれが起こっているのかわかりません。

- (void)doInBackground
{
 dispatch_queue_t myQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
    dispatch_async(myQueue, ^{
        [self reloadData];

        dispatch_sync(dispatch_get_main_queue(), ^{

            [MBProgressHUD hideHUDForView:self.view animated:YES];
            [self performSelectorOnMainThread: @selector(sortData:) withObject:self waitUntilDone:YES];

        });
    });
}

- (void)reloadData
{
 NSArray *allProducts = [NSArray array];    
 allProducts =   [NSArray arrayWithArray:[Product MR_findAll]];
 self.products = [NSArray arrayWithArray:allProducts];
} 
4

1 に答える 1

3

まず、コンテキストを指定せずに MR_findAll のみを使用して、暗黙的にデフォルトのコンテキストを使用しています。これにより、最終的にクラッシュやその他の未知の動作が発生します。第二に、これらすべての NSArray は必要ありません。MR_findAll (および他のすべての MR_find* メソッド) の戻り値は、結果の配列を返します。配列から配列へとコンテンツを移動する必要はありません...

そして最後に、あなたの質問。メイン コンテキスト キューでフェッチを行っているため、フェッチによって UI がブロックされます。次のように、Private Queue コンテキストを作成し、それを使用してフェッチを実行する必要があります。

NSManagedObjectContext *privateQueueContext = [NSManagedObjectContext MR_privateQueueContext];
NSArray *results = [Product MR_findAllInContext:privateQueueContext];

また、フェッチのバッチ処理を検討することもできます。次のようなフェッチ リクエストの取得に関するドキュメントを参照してください。

NSFetchRequest *request = [Product MR_requestAllInContext:privateQueueContext];
//update batch size here

MagicalRecord はバッチ サイズを内部的に設定していますが、変更する必要がある場合は、このようにします。

于 2013-09-01T16:33:53.023 に答える