1

私の状況では、私のアプリはコア データを使用しており、そのコア データから画像を読み込んでテーブル ビューに表示する必要があります。これには時間がかかるため、バックグラウンド スレッドで実行する必要があります。だから私はこのようなコードを持っています:

dispatch_async(queue, ^{

    if (self.cellInfo.numberOfMediaItems > 0) {

        int i = 0;

        int numberOfThumbnails = MIN(self.cellInfo.numberOfMediaItems, 3);

        while (i < numberOfThumbnails) {
            Media *media = [self.entry.media objectAtIndex:i];

            UIImage *image = [media getThumbnail];
            [self.mediaArray addObject:image];
            i++;
        }
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        self.isFinishedProcessing = YES;

        [self setNeedsDisplay];
    });

});

これにより、プロセスが大幅に高速化され、準備が整うと画像が背景に表示されます。

問題は、フォアグラウンド スレッドがバックグラウンド スレッドと同時にコア データにアクセスしようとする場合があることです。これは気に入らないので、クラッシュします。これは、多くの開発者が陥る状況であり、解決策があるはずです。両方が同時にコア データへのアクセスを開始したときにアプリがクラッシュしないように、状況に対処する方法を知りたいですか?

4

2 に答える 2

6

ここで私の以前の回答を参照してください

コア データに関しては、スレッドごとに 1 つの管理対象オブジェクト コンテキストという黄金律があります。マネージド オブジェクト コンテキストはスレッド セーフではないため、バックグラウンド タスクで作業を行っている場合は、メイン スレッドを使用して UI 操作とのスレッドの競合を回避するか、新しいコンテキストを作成して作業を行います。数秒後、後者を実行して、UI がロックアップしないようにする必要があります。

つまり、バックグラウンド スレッドで使用する別のマネージド オブジェクト コンテキストを作成する必要があります。次に、必要に応じて変更を元のコンテキストにマージする必要があります。

于 2012-05-30T15:21:39.077 に答える
1

Apple の Core Data プログラミング ガイドを読む必要があります。

基本的に、NSManagedObjects と NSManagedObjectContexts はスレッドセーフではありません。作業を行うには、バックグラウンド コンテキストで新しい NSManagedObjectContext を作成する必要があります。スレッド間で NSManagedObjects を渡すことはできません。代わりに、NSManagedObjectID の配列を格納し、それを使用して新しいコンテキストからオブジェクトを「リロード」できます。

于 2012-05-30T15:22:30.277 に答える