У меня есть NSManagedObjectContext, объявленный так:
- (NSManagedObjectContext *) backgroundMOC {
    if (backgroundMOC != nil) {
        return backgroundMOC;
    }
    backgroundMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    return backgroundMOC;
}
Обратите внимание, что он объявлен с типом частной очереди concurrency, поэтому его задачи должны выполняться в фоновом потоке. У меня есть следующий код:
-(void)testThreading
{
    /* ok */
    [self.backgroundMOC performBlock:^{
        assert(![NSThread isMainThread]); 
    }];
    /* CRASH */
    [self.backgroundMOC performBlockAndWait:^{
        assert(![NSThread isMainThread]); 
    }];
}
Почему вызов performBlockAndWait выполняет задачу в основном потоке, а не в фоновом потоке?