2016-07-18 13 views
1

Core Dataで厄介な問題がありました。私のアプリはiPhoneから連絡先を取得し、それを私のデータベースに保存する必要があります。私はバックグラウンドスレッドでそれをしようとしています。 AppDelegateでコアデータが列挙されているうちに突然変異しました

[self performSelectorInBackground:@selector(fetchingContact) withObject:nil]; 


    -(void)fetchingContact{ 
    // Some Code 
    for (int i = 0; i < nPeople; i++) 
    { 
    //Some Code 
     NSManagedObjectContext *context = [APP_DELEGATE managedObjectContext]; 
     ABRecordID recordID = ABRecordGetRecordID(person); 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:context]; 
     [fetchRequest setEntity:entity]; 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(contactId = '%d')",recordID]]; 
     [fetchRequest setPredicate:predicate]; 
     NSError *error = nil; 
//crash 
     NSArray *contactObjArray = [context executeFetchRequest:fetchRequest error:&error]; 
//crash 
     if (error) {} 
     Contact *contacts; 
     if (contactObjArray.count == 0) { 
      contacts = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:context]; 
     }else { 
      contacts = [contactObjArray objectAtIndex:0]; 
     } 
    //Some Code 
    } 
    } 

ここ

- (NSManagedObjectContext *)managedObjectContext 
{ 
    NSLog(@"managedObjectContext"); 
    // Returns ;the managed object context for the application (which is already bound to the persistent store coordinator for the application.) 
    if (_managedObjectContext != nil) { 
      return _managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (!coordinator) { 
      return nil; 
    } 
    _managedObjectContext = [[NSManagedObjectContext alloc]initWithConcurrencyType: NSMainQueueConcurrencyType]; 
    [_managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    return _managedObjectContext; 
} 

私は私のCore Dataに保存しようとするが、それはエラーでクラッシュ:

私はそのためのコード上で使用

*終了アプリによるキャッチされない例外に 'NSGenericException'、理由:「*コレクション< __NSCFSet:0x15fad880>は、この行でenumerated.'`ながら変異させた:私はすでにオンライン検索

NSArray *contactObjArray = [context executeFetchRequest:fetchRequest error:&error]; 

、私が見つかりました。多くのものが何も私を助けません。私がそれを実行すると、Core Dataが変更された場所、またはContactエンティティがありません。これは非常に奇妙なエラーです。私はメインスレッドで実行した場合

は、私は、エラー/ノークラッシュを取得しませんが、アプリが(実行中)、その時点で終了している場合、私はContact

してください、任意のヘルプのすべてのコンテンツを失います。より多くの情報が必要な場合は教えてください。

+0

例外を送出するのは、どの回線ですか?例外ブレイブポイントを設定する – Paulw11

+0

私はただ編集するだけです。申し訳ありませんが、私はラインを特定することを忘れています。私は毎回クラッシュすることはありません。自発的に接触150,200,300でクラッシュする可能性があります。 –

+0

executeFetchRequestの結果をcontactObjArray == nilで確認してから、エラーを確認してください。また、[NSString stringWithFormat:...]引数は不要です。[NSPredicate predicateWithFormat:] – DDP

答えて

1

このエラーは、取得しようとしているコアデータを変更しているときに発生します。

これもループの原因になる可能性があります。他の検索を行う前に、保存せずにcoredataに新しいオブジェクトを挿入しています。

お気に入り 私はCore Dataに厄介な問題があります。私のアプリはiPhoneから連絡先を取得し、それを私のデータベースに保存する必要があります。私はバックグラウンドスレッドでそれをしようとしています。

私はそのためのコード上で使用

[self performSelectorInBackground:@selector(fetchingContact) withObject:nil]; 


-(void)fetchingContact{ 
// Some Code 
for (int i = 0; i < nPeople; i++) 
{ 
//Some Code 
    NSManagedObjectContext *context = [APP_DELEGATE managedObjectContext]; 
    ABRecordID recordID = ABRecordGetRecordID(person); 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:context]; 
    [fetchRequest setEntity:entity]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(contactId = '%d')",recordID]]; 
    [fetchRequest setPredicate:predicate]; 
    NSError *error = nil; 
    NSArray *contactObjArray = [context executeFetchRequest:fetchRequest error:&error]; 
    if (error) {} 
    Contact *contacts; 
    if (contactObjArray.count == 0) { 
     contacts = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:context]; 
     [context save:&error]; 
    }else { 
     contacts = [contactObjArray objectAtIndex:0]; 
    } 
//Some Code 
} 
} 

それはあなたのメソッドが複数回呼び出されたかどうかを確認多分、あなたの問題が解決しない場合。

+0

それは正解と思われます。ありがとうございました –

関連する問題