0

CPU が 100% になり、メイン スレッドがバックグラウンド キューでブロックされる可能性はありますか。私はそのようにします:

まず、カスタム セッターでコンテキストを作成します。

-(void)setContext:(NSManagedObjectContext *)context {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        _context = context;
    });
}

次に、使用していくつかのデータをダウンロードNSURLConnectionDataDelegateし、挿入する方法を次に示します。

-(void)connectionDidFinishWithObject:(NSArray*)arrayOfObjects {

    dispatch_queue_t fetchQ = dispatch_queue_create("myDispatch", NULL);
    dispatch_async(fetchQ, ^{
                [self.context performBlock:^{
                    for(NSDictionary *dic in myArr) {
                        [Tournament  tournamentWithDictionary:dic inMOC:self.context];
                    }
                }];
            }

}

そして、ここにNSManagedObjectサブクラスへの私の挿入があります:

+(Tournament*)tournamentWithDictionary:(NSDictionary*)dictionary inMOC:(NSManagedObjectContext*)moc {
 Tournament *finalElement;   

    if(!finalElement) {
        finalElement = [NSEntityDescription insertNewObjectForEntityForName:@"Tournament" inManagedObjectContext:moc];
        [finalElement setTournamentID:[NSNumber numberWithInt:[[dictionary objectForKey:@"ID"] integerValue]]];
    }
    return finalElement;
}

CPU 使用率が 100% になり、インターフェイスがブロックされています。どうして?!

4

3 に答える 3

2

デバッガーの下で実行し、「一時停止」を押して、メイン スレッドが何をしているかを調べます。Instruments を使用して、どのコードが実行されて CPU を消費しているかを表示します。

于 2013-06-13T17:37:10.587 に答える
1

メイン キューで Core Data をどのように使用しているかはまだはっきりしていませんが、通常の原因は次のとおりです。

  1. SQLite 永続ストアを使用しました。
  2. NSManagedObjectメイン キューのプロパティにアクセスしています。
  3. 同時に、他のキューに保存しています。

メイン キューへのアクセスにはデータベースへのトリップが必要です。これは通常、アクセスしているオブジェクトが現在障害であるためです。ただし、データベースへの他のトリップも同様に問題があります。したがって、明示的に実行するか、スクロールのために何らかの作業を行わなければならないNSFetchRequestアクティブにすることは、どちらも同等の条件です。NSFetchedResultsController

残念ながら、SQLite はスレッド セーフではありません。一部の結果として、保存中はデータベースにアクセスできません。多数のエントリを挿入した場合、インデックスが複雑な場合、またはその他の理由により、保存にかなりの時間がかかることがあります。

したがって、メイン キューはデータベースへの同期トリップを必要としますが、Core Data は保存が完了するまで待機する必要があります。したがって、ブロックする必要があります。

于 2013-06-13T19:40:51.283 に答える