NSFetchedResultsController не показывает обновления из другого контекста

у меня естьNSFetchedResultsController и несколько операций обновляют управляемые объекты в отдельных потоках черезNSOperationQueue.

FRC (с его предикатом) выглядит так:

<code>- (NSFetchedResultsController*)fetchedResultsController
{
    if(fetchedResultsController) return fetchedResultsController;

    NSManagedObjectContext* mainContext = [self managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Check" inManagedObjectContext:mainContext]];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"isSync == %@", [NSNumber numberWithBool:NO]]];
    [fetchRequest setFetchBatchSize:10];

    fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:nil];
    fetchedResultsController.delegate = self;

    [fetchRequest release], fetchRequest = nil;

    return fetchedResultsController;
}
</code>

Основной поток и многопоточная операция имеют свои собственные контексты управляемого объекта. У них только один и тот же координатор.

В рамках резьбовой операции я меняюisSync собственность отNO вYES, Чтобы знать, что этоCheck сущность для обновления, основной контекст переходит к многопоточномуNSManagedObjectID. The threaded operation retrieves the managed object like the following:

<code>-(void)main
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSManagedObjectContext *exportContext = [[NSManagedObjectContext alloc] init];
    [exportContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]];

    //...

    Check* check = (Check*)[exportContext existingObjectWithID:objID error:&error];
    check.isSync = [NSNumber numberWithBool:YES];

    //...

    [exportContext save:&error];

    [pool release], pool = nil;
}
</code>

Когда операция потока вызываетsave mergeChangesFromContextDidSaveNotification вызывается уведомление, и основной контекст объединяет изменения.

<code>- (void)contextChanged:(NSNotification*)notification
{
    if ([notification object] == [self managedObjectContext]) return;

    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:YES];
        return;
    }

    [[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}
</code>

Регистрация описаниеnotification приводит к проверке того, что изменения выполнены правильно.

My problem

Делегаты методыNSFetchedResultsControllerDelegate не называются.

Это довольно странно, поскольку работа с одним и тем же контекстом, основным, позволяет прослушивать изменения и вызывать методы делегатов, например, удаление объекта строки вUITableView.

Я нашел несколько тем для SO с такой же проблемой. Я испробовал все обходные пути, но не могу найти ценное решение:

NSFetchedResultsController not showing updates from other contexts

NSFetchedResultsController not firing delegate method after merging update from background thread

NSFetchedResultsController with predicate ignores changes merged from different NSManagedObjectContext

Заранее спасибо.

Edit

The code above was working in a previous model. Then I created a new model copying (and pasting) entities from the previous one and now it doesn't work anymore.

Предложения?

Edit 2

Это предикат, который я использую вNSFetchedResultsController добытчик. Это моя вина, но когда я написал сообщение, я не скопировал его.

<code>NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"insertionDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

// previous code here
[fetchRequest setSortDescriptors:sortDescriptors];
</code>

Теперь оJody последний комментарий

In the main() of your NSOperation, you are loading new objects, and in there it looks like you are setting isSync to YES for each new object. The predicate you use for the fetchedResultsController is looking only for objects that have isSync == NO.

Я ожидал, что когда собственностьisSync установлено в ДА,NSFetchedResultsController отмечает, что изменяет и удаляет строки, которые не соответствуют предикату. Я ошибся?

Помните, что при объединении изменений из фона в основной поток я вижу, что несколько объектов обновили своиisSync имущество.

Ответы на вопрос(2)

Ваш ответ на вопрос