Я застрял в проблеме часами и прочитал все об этом в stackoverflow (и применил все найденные советы), теперь мне официально нужна помощь.; О)
Вот контекст:
В моем проекте iPhone мне нужно импортировать данные в фоновом режиме и вставить его в контексте управляемого объекта. Следуя советам, найденным здесь, вот что я делаю:
- Сохранить основной файл
 - Создайте фоновый мок с постоянным координатором хранилища, используемым основным моком
 - Зарегистрируйте мой контроллер как наблюдателя уведомления NSManagedObjectContextDidSaveNotification для фона moc
 - Вызов метода импорта в фоновом потоке
 - Каждый раз, когда данные принимаются, вставляйте их на фоне moc
 - После того как все данные были импортированы, сохраните фоновый мок
 - Объединить изменения в основной moc, в основной поток
 - Отмените регистрацию моего контроллера как наблюдателя для уведомления
 - Reset и отпустите фоновый мок
 
Иногда (и случайным образом) исключение...
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x5e0b930> was mutated while being enumerated...
... вызывается, когда я вызываю executeFetchRequest на фоне moc, чтобы проверить, уже ли импортированные данные уже существуют в базе данных. Интересно, что мутирует набор, поскольку ничего не происходит за пределами метода импорта.
Я включил весь код моего контроллера и свой тестовый объект (мой проект, состоящий из этих двух классов и делегата приложения, который не был изменен):
//
//  RootViewController.h
//  FK1
//
//  Created by Eric on 09/08/10.
//  Copyright (c) 2010 __MyCompanyName__. All rights reserved.
//
#import <CoreData/CoreData.h>
@interface RootViewController : UITableViewController <NSFetchedResultsControllerDelegate> {
    NSManagedObjectContext *managedObjectContext;
    NSManagedObjectContext *backgroundMOC;
}
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSManagedObjectContext *backgroundMOC;
@end
//
//  RootViewController.m
//  FK1
//
//  Created by Eric on 09/08/10.
//  Copyright (c) 2010 __MyCompanyName__. All rights reserved.
//
#import "RootViewController.h"
#import "FK1Message.h"
@implementation RootViewController
@synthesize managedObjectContext;
@synthesize backgroundMOC;
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.toolbarHidden = NO;
    UIBarButtonItem *refreshButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshAction:)];
    self.toolbarItems = [NSArray arrayWithObject:refreshButton];
}
#pragma mark -
#pragma mark ACTIONS
- (void)refreshAction:(id)sender {
    // If there already is an import running, we do nothing
    if (self.backgroundMOC != nil) {
        return;
    }
    // We save the main moc
    NSError *error = nil;
    if (![self.managedObjectContext save:&error]) {
        NSLog(@"error = %@", error);
        abort();
    }
    // We instantiate the background moc
    self.backgroundMOC = [[[NSManagedObjectContext alloc] init] autorelease];
    [self.backgroundMOC setPersistentStoreCoordinator:[self.managedObjectContext persistentStoreCoordinator]];
    // We call the fetch method in the background thread
    [self performSelectorInBackground:@selector(_importData) withObject:nil];
}
- (void)_importData {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backgroundMOCDidSave:) name:NSManagedObjectContextDidSaveNotification object:self.backgroundMOC];         
    FK1Message *message = nil;
    NSFetchRequest *fetchRequest = nil;
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"FK1Message" inManagedObjectContext:self.backgroundMOC];
    NSPredicate *predicate = nil;
    NSArray *results = nil;
    // fake import to keep this sample simple
    for (NSInteger index = 0; index < 20; index++) {
        predicate = [NSPredicate predicateWithFormat:@"msgId == %@", [NSString stringWithFormat:@"%d", index]];
        fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
        [fetchRequest setEntity:entity];
        [fetchRequest setPredicate:predicate];
        // The following line sometimes randomly throw the exception :
        // *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x5b71a00> was mutated while being enumerated.
        results = [self.backgroundMOC executeFetchRequest:fetchRequest error:NULL];
        // If the message already exist, we retrieve it from the database
        // If it doesn't, we insert a new message in the database
        if ([results count] > 0) {
            message = [results objectAtIndex:0];
        }
        else {
            message = [NSEntityDescription insertNewObjectForEntityForName:@"FK1Message" inManagedObjectContext:self.backgroundMOC];
            message.msgId = [NSString stringWithFormat:@"%d", index];
        }
        // We update the message
        message.updateDate = [NSDate date];
    }
    // We save the background moc which trigger the backgroundMOCDidSave: method
    [self.backgroundMOC save:NULL];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:self.backgroundMOC];
    [self.backgroundMOC reset]; self.backgroundMOC = nil;
    [pool drain];
}
- (void)backgroundMOCDidSave:(NSNotification*)notification {    
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(backgroundMOCDidSave:) withObject:notification waitUntilDone:YES];
        return;
    }
    // We merge the background moc changes in the main moc
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
@end
//
//  FK1Message.h
//  FK1
//
//  Created by Eric on 09/08/10.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import <CoreData/CoreData.h>
@interface FK1Message :  NSManagedObject  
{
}
@property (nonatomic, retain) NSString * msgId;
@property (nonatomic, retain) NSDate * updateDate;
@end
// 
//  FK1Message.m
//  FK1
//
//  Created by Eric on 09/08/10.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import "FK1Message.h"
@implementation FK1Message 
#pragma mark -
#pragma mark PROPERTIES
@dynamic msgId;
@dynamic updateDate;
@end
Это все! Весь проект здесь. Нет представления в таблице, нет NSFetchedResultsController, не что иное, как фоновый поток, который импортирует данные на фоне moc.
Что может мутировать набор в этом случае?
Я почти уверен, что мне не хватает чего-то очевидного, и это сводит меня с ума.
ИЗМЕНИТЬ:
Вот полная трассировка стека:
    2010-08-10 10:29:11.258 FK1[51419:1b6b] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x5d075b0> was mutated while being enumerated.<CFBasicHash 0x5d075b0 [0x25c6380]>{type = mutable set, count = 0,
entries =>
}
'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x0255d919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x026ab5de objc_exception_throw + 47
    2   CoreFoundation                      0x0255d3d9 __NSFastEnumerationMutationHandler + 377
    3   CoreData                            0x02287702 -[NSManagedObjectContext executeFetchRequest:error:] + 4706
    4   FK1                                 0x00002b1b -[RootViewController _fetchData] + 593
    5   Foundation                          0x01d662a8 -[NSThread main] + 81
    6   Foundation                          0x01d66234 __NSThread__main__ + 1387
    7   libSystem.B.dylib                   0x9587681d _pthread_start + 345
    8   libSystem.B.dylib                   0x958766a2 thread_start + 34
)
terminate called after throwing an instance of 'NSException'