0

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

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

4

0 回答 0