0

[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
4

3 に答える 3

1

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

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

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

}];

NSConfinementConcurrencyType: 古い制限モデルでコンテキストを初期化している場合、 performBlock は機能しません。

お役に立てれば。

于 2016-05-25T11:04:14.877 に答える
1

2つの操作を同時に行っていますか? 1 つはそれを列挙し、もう 1 つは保存します。

于 2016-05-25T11:27:52.620 に答える