アプリを Xcode 6.4 から Xcode 7 および Swift 2 に移行しました。アプリは 2 つの MOC で CoreData を使用し、マルチスレッド違反の警告なしで正常に動作していました。そして今、iOS 8.4 および 8.3 を実行しているデバイスまたはシミュレーターで Xcode 7 からコンパイルすると、有名な "Multithreading_Violation_AllThatIsLeftToUsIsHonor" が得られます。iOS 9 および 8.3 より前の iOS 8 を実行しているデバイスで問題なく動作します。また、Xcode 6.4 およびすべての iOS バージョンでも問題なく動作します。
Xcode 6.4 = すべての iOS でうまく動作します
Xcode 7 = 8.3 および 8.4 のみで中断
コードを確認しましたが、すべて問題ないと思います。
エラーを発生させる行はresult = [context executeFetchRequest:request error:&error];
- (void)getActiveUserWithCompletion:(void (^)(User *user))completion {
NSManagedObjectContext *context = [[CoreDataManager singleton] getInsertContext];
NSManagedObjectContext *mainContext = [[CoreDataManager singleton]getContext];
__block NSError * error = nil;
__block NSArray *result = [NSArray array];
[context performBlock:^{
NSFetchRequest *request= [[NSFetchRequest alloc] init];
[request setEntity: [NSEntityDescription entityForName:K_COREDATA_USER inManagedObjectContext:context]];
[request setPredicate:[NSPredicate existToken]];
[request setFetchLimit:1];
result = [context executeFetchRequest:request error:&error];
if ( result.count == 1 ) {
User *user = result.firstObject;
NSManagedObjectID *moid = [user objectID];
[mainContext performBlock:^{
User *activeUser = (User *)[mainContext existingObjectWithID:moid error:&error];
completion(activeUser);
}];
}else if ( result.count > 1 ) {
completion(nil);
}else {
completion(nil);
}
}];
}
述語コード:
+ (NSPredicate *)existToken{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"sessionToken != nil"];
return predicate;
}
非常によく似たエラーが Apple dev フォーラムにありますが、解決策はありません: Apple Developer forum
アドバイスや解決策は大歓迎です。