Xcode 7 + iOS 8 CoreData多线程违规

时间:2016-01-21 10:06:55

标签: ios core-data xcode7 ios8.3 ios8.4

我们已将我们的应用程序从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

欢迎任何建议或解决方案。

0 个答案:

没有答案