ASINetworkQueue внутри NSOperation ошибка при сохранении основных данных - PullRequest
1 голос
/ 14 декабря 2011

Я хочу использовать ASINetworkQueue внутри NSOperation.Это прекрасно работает и не создает проблем.Что терпит неудачу, так это сохранение основных данных.Я установил новый NSManagedObjectContext для этой операции, как сказано в документации.

Я думаю, что проблема в том, что я сохраняю данные, когда ASINetworkQueue завершает работу и вызывается селектор делегата.Поскольку делегаты вызываются в mainThread, сообщение сохранения не получается.

Может ли это быть проблемой, и есть ли у кого-нибудь решение?

1 Ответ

0 голосов
/ 14 декабря 2011

Вы используете правильный метод PerformSelectorOnMainThread (чтобы объединить изменения из нового экземпляра ManagedObjectContext)?

Я делаю что-то подобное в моих операциях (ctx - это мой экземпляр MOC):

Сначала зарегистрируйтесь для уведомлений:

// Register context with the notification center
        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 

        [nc addObserver:self
               selector:@selector(mergeChanges:) 
                   name:NSManagedObjectContextDidSaveNotification
                 object:ctx];

Затем, когда вам нужно сохранить контекст:

if ([ctx hasChanges]) {
            error = nil;

            // Save the context.
            if (![ctx save:&error])
            {
                // Do something with the error
            }

            // Clear out the scratchpad
            [ctx reset];

        }

И затем метод, который выполняет слияние с основным MOC:

- (void)mergeChanges:(NSNotification *)notification
{
    id appDelegate = [[UIApplication sharedApplication] delegate];  

    NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];
    // Merge changes into the main context on the main thread
    [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
                                  withObject:notification
                               waitUntilDone:NO];
    // NSLog(@"Merged Changes");
}

Надеюсь, это поможет

...