Смущен тем, как fetchResultController работает с MagicalRecord - PullRequest
3 голосов
/ 29 сентября 2011

У меня есть подкласс NSOperation, это основной метод:

(void)main
{
    NSAutoreleasePool *Pool = [[NSAutoreleasePool alloc] init];

    managedObjectContext = [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThread];

    Message *message = (Message *) [managedObjectContext objectWithID:self.messageID];
    message.status = [NSNumber numberWithInt:SKMessageSendStateStart];
    [message save];
    [self send];
    [self finish];
    [Pool drain];
}

Я определяю fetchResultController и defaultContext следующим образом:

(BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [MagicalRecordHelpers setupCoreDataStackWithStoreNamed:@"Shark"];

    self.context = [NSManagedObjectContext context];
    [NSManagedObjectContext setDefaultContext:self.context];

    self.fetchController = [Message fetchRequestAllGroupedBy:nil withPredicate:nil sortedBy:@"text" ascending:YES];
    [self.fetchController setDelegate:self];
    [self.fetchController performFetch:nil];
}

Каждый раз, когда я вызываю [сохранение сообщения],выход из консоли: -NSManagedObjectContext (MagicalRecord) mergeChangesFromNotification: объединение изменений в * DEFAULT context в главном потоке *

Но NSFetchedResultsControllerDelegate никогда не получаютназывается!Значит ли это, что я неправильно установил FetchedResultsController или как?Я в полном замешательстве.

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

Ответы [ 2 ]

4 голосов
/ 26 октября 2011

Причина, по которой это не работает, заключается в том, что MagicalRecord автоматически вызовет executeFetch: для вас, таким образом, не позволяя вам установить делегата заранее.

Также, в вашем приложении DidFinishLaunching: метод, вы хотите удалить эти строки:

self.context = [NSManagedObjectContext context];
[NSManagedObjectContext setDefaultContext:self.context];

В этом случае вы НЕ хотите изменять контекст по умолчанию. MagicalRecord обрабатывает вещи для вас, когда вы вызываете setupCoreDataStackWithStoreNamed: ... то есть MOC уже доступен для использования после завершения этого метода, нет необходимости бросать тот, который он создал для вас, и устанавливать контекст по умолчанию для нового экземпляра. в данном конкретном случае.

Нет необходимости также удерживать контекст, если все, что вы делаете, собирается использовать его для передачи одному из методов выборки, предоставляемых MagicalRecord. MagicalRecord создаст один контекст для своего использования (контекст по умолчанию) и просто использует это ...

1 голос
/ 15 октября 2011

Я неправильно понял, что означает [контекст NSManagedObjectContext]. Это создает новый контекст в главном потоке. Поскольку контекст, в котором отслеживается fetchResultController, не совпадает с контекстом, в который было включено изменение, NSFetchedResultsControllerDelegate вызываться не будет.

Изменение [NSManagedObjectContext context] на [NSManagedObjectContext defaultContext] решило проблему.

...