我们已将我们的应用程序从 Xcode 6.4 迁移到 Xcode 7 和 Swift 2。该应用程序使用 CoreData 和 2 个 MOC,并且运行良好,没有任何多线程违规警告。现在,从 Xcode 7 编译,在运行 iOS 8.4 和 8.3 的设备或模拟器下,我们得到了著名的“Multithreading_Violation_AllThatIsLeftToUsIsHonor”。它适用于运行 8.3 之前的任何 iOS 9 和 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 开发论坛上: Apple Developer forum
欢迎任何建议或解决方案。