0

基本的に、UIをブロックせずにバックグラウンドスレッドでコアデータを更新して保存する必要があります。保存後、テーブルビューをリロードして変更を表示する必要があります。だからこれをするために私は使うことを考えました

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Add code here to do background processing
   NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    self.backgroundManagedObjectContext = context;
    if(self.managedObjectContext == nil)
        self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    self.backgroundManagedObjectContext.parentContext = self.managedObjectContext;

    //update data
    [self getDataFromFile];

dispatch_async( dispatch_get_main_queue(), ^{
        // Add code here to update the UI/send notifications based on the
        // results of the background processing
        [[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadAppDelegateTable" object:nil];
        [context release];
    });
});

データをフェッチしようとするとgetDataFromFileに

if(![NSThread isMainThread])
{
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"LogDetails" inManagedObjectContext:self.backgroundManagedObjectContext];
    [request setEntity:entity];
    logs = [self.backgroundManagedObjectContext executeFetchRequest:request error:nil];
}

エラーが発生します*キャッチされない例外'NSInternalInconsistencyException'が原因でアプリを終了します、理由:' + entityForName:エンティティ名'LogDetails''のNSManagedObjectModelが見つかりませんでした

このエラーが発生する理由を誰かが説明できますか

また、それをバックグラウンドのmanagedObjectContextとして含めるか、親をメインスレッドのmanagedObjectContextとして持つ子のmanagedObjectContextとして含めるかについて別の疑問があります。

4

1 に答える 1

1

1つのNSManagedContextは、1つのスレッドでのみ使用する必要があります。スレッド間でNSManagedObjectを渡すことは、潜在的に安全ではありません。

于 2013-03-07T11:41:11.083 に答える