0

コアデータに複数の非同期データが保存されるため、私は自分のアプリを実行するので、常に[context executeFetchRequest:request error:&error]にクラッシュします。だからこの問題をどう扱うか?私はこのコードを試しています。コアデータの[context executeFetchRequest:request error:&error]にクラッシュしますか?

 NSManagedObjectContext *context =[appDelegate managedObjectContext]; 
     NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:context]; 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"clientId = %@",clientId]]; 
     [request setPredicate:predicate]; 
     [request setEntity:entity]; 

     NSError *error = nil; 
     NSMutableArray *mutableFetchResults =(NSMutableArray *)[context executeFetchRequest:request error:&error]; 
     if (mutableFetchResults == nil) 
     { 
      NSLog(@"ERROR - %@", error); 
     } 
     if (mutableFetchResults!=nil && [mutableFetchResults count]>0) 
     { 
      return [mutableFetchResults objectAtIndex:0]; 
     } 
     else 
     { 
      return nil; 
     } 

これが私のクラッシュログです:

Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x7fac74d0a290> was mutated while being enumerated.' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010baa3e65 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x000000010b0c8deb objc_exception_throw + 48 
    2 CoreFoundation      0x000000010baa37c4 __NSFastEnumerationMutationHandler + 132 
    3 CoreData       0x0000000109f486ef -[NSManagedObjectContext executeFetchRequest:error:] + 2111 
    4 CuztomisePharma      0x0000000109acbec9 -[SyncManager getClientByClientId:] + 489 
    5 CuztomisePharma      0x0000000109ac9cf6 -[SyncManager saveClient:] + 214 
    6 CuztomisePharma      0x0000000109ac98a6 -[SyncManager firstTimeSync] + 2406 
    7 CuztomisePharma      0x0000000109a31029 -[LoginViewController loginServerCall] + 1273 
    8 Foundation       0x000000010ad52dfb __NSThread__start__ + 1198 
    9 libsystem_pthread.dylib    0x000000010e37299d _pthread_body + 131 
    10 libsystem_pthread.dylib    0x000000010e37291a _pthread_body + 0 
    11 libsystem_pthread.dylib    0x000000010e370351 thread_start + 13 
) 
2016-05-25 14:23:08.682 CuztomisePharma[6615:146656] The selected car is: (
    "<Drug: 0x7fac75d18150> (entity: Drug; id: 0xd0000000002c001e <x-coredata://AE430EFF-FF79-48C9-BDB3-08707B8B172F/Drug/p11> ; data: <fault>)" 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+0

クラッシュログがありますか? – Larme

+0

@Larme upperは私のクラッシュログです。 –

+1

すべてのスレッドとコンテキストについて教えてください。バックグラウンドスレッドのメインコンテキストを使用しているようです... – Wain

答えて

1

NSManagedObjectContextはスレッドセーフではありません。 main threadにコンテキストを作成する場合は、main threadのコンテキストにのみアクセスできます。

メインスレッドでexecuteFetchRequestを実行する必要があります。代わりにperformBlockを使用して、独自のスレッドで実行するようにスケジュールします。

[context performBlock:^{ 
    NSMutableArray *mutableFetchResults =(NSMutableArray *)[context executeFetchRequest:request error:&error]; 

}]; 

:古いNSConfinementConcurrencyType閉じ込めモデルのコンテキストを初期化している場合performBlockは動作しません。

これが役に立ちます。

1

同時に2つの操作をしていますか? 1つはそれを列挙し、もう1つは節約する。

0

-executeFetchRequest:NOT可変配列を返します。 NSMutableArrayにキャストしただけでは、NSMutableArrayにはなりません。

まず、突然変異が起こっていない配列を変異させないでください。

第2に、リターンをキャスティングしないでください。あなたは可変配列をしたい場合は、適切にそれを変換する必要があります。

NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy]; 

は再び、決してフェッチ結果に可変配列を使用する理由はありません。結果の配列は変更できません。

あなたの質問に表示されたエラーは、そのコードが配列の変異ではないことを示したコードと一致しません。

-getClientByClientId:のコードをクラッシュが発生している場所に表示します。

関連する問題