我们已将我们的应用程序从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 dev论坛上有一个非常类似的错误,没有任何可行的解决方案: Apple Developer forum
欢迎任何建议或解决方案。