0

アプリを 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

アドバイスや解決策は大歓迎です。

4

0 に答える 0