2014-10-15 1 views
1

У меня есть два контекста управляемого объекта с той же моделью данных. Единственное различие заключается в том, что один является readonly, а другой - чтением/записью. Я хочу найти объект, который может находиться в любом из этих двух контекстов управляемых объектов. Поэтому я создаю fetchrequest и хочу использовать fetchrequest для обоих контекстов управляемых объектов.Один FetchRequest в двух ManagedObjectContexts

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; 
[fetchRequest setIncludesPendingChanges:YES]; 
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name=%@", name]; 

NSError *error = nil; 
NSArray *privateobjects = [self.privateManagedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (privateobjects && privateobjects.count > 0) 
{ 
    return privateobjects[0]; 
} 

NSArray *publicobjects = [self.publicManagedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (publicobjects && publicobjects.count > 0) 
{ 
    return publicobjects[0]; 
} 

return nil; 

Приведенный выше код не возвращает результаты из контекста общего управляемого объекта. Я могу исправить это, воссоздав fetchrequest. Итак, мой вопрос, почему один fetchrequest не работает в обоих контекстах управляемых объектов?

Редактировать: После нескольких исследований кажется, что fetchrequest работает с обоими контекстами управляемых объектов, когда оба контекста сохраняются. Всякий раз, когда вы ищете ожидающие изменения, публичный (второй) контекст не возвращает результаты.

ответ

2

Я считаю, что вы должны создать запрос выборки в два раза, потому что это зависит от контекста управляемого объекта. NSFetchRequest(entityName:) действительно является сокращением для запроса выборки с определенным NSEntityDescription, но без контекста управляемого объекта. Контекст, заполненный в последний момент, когда вы выполняете запрос выборки с помощью метода NSManagedObjectContext. (Метод фабрики NSEntityDescription включает в себя контекст).

Таким образом, вы можете попытаться создать метод удобства, который возвращает такой «неполный» запрос на выборку, а затем использовать его в разных контекстах. (Не уверен, что это работает, но если это произойдет, это сэкономит вам около 2-3 строк кода). Кроме того, просто напишите код для создания запроса на выборку еще раз.

+0

спасибо !! «Контекст, заполненный в последний момент, когда вы выполняете запрос выборки с помощью метода NSManagedObjectContext (метод фабрики NSEntityDescription включает контекст)». Это именно то, что я искал. –

0

вы должны добавить уведомление об изменении данных в экземпляр NSFetchRequest.

Делегат NSFetchedResultsControllerDelegate используется, когда изменяется изменение fetchRequest. Код Делегат может быть как:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    { 
     [[NSNotificationCenter defaultCenter] postNotificationName:kNotification_LocalContactStorageSaved 
                  object:nil]; 
    } 

    #pragma mark - context merge from other MOC 

    - (void)contextDidSave:(NSNotification *)notification 
    { 
     NSManagedObjectContext *sender = (NSManagedObjectContext *)[notification object]; 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       [managedObjectContext_localContacts mergeChangesFromContextDidSaveNotification:notification]; 
      }); 
    } 
+0

Я понятия не имею, что вы пытаетесь решить здесь. Моя проблема не имеет ничего общего с NSFetchedResultsController, и контексты независимы, они никогда не будут сливаться. – ggfela

+0

, вы можете использовать сохранение в частном контексте управления, чтобы сохранить изменения в хранилище. Публичный получит данные из магазина (без использования кэша) –

+0

Просто протестировал его. Если я сохраню только первый контекст, я все равно не могу получить ожидающие изменения из второго контекста. – ggfela