Как определить уведомления от определенной операции сохранения NSManagedObjectContext? - PullRequest
1 голос
/ 10 марта 2012

Я пишу приложение, которое использует Core Data, но синхронизирует свои данные с сервером по HTTP. Я отслеживаю уведомления NSManagedObjectContext, чтобы я мог реагировать на изменения в данных.

Обновлено на основе первоначальных ответов: Спасибо за предложения. Похоже, мне нужно объяснить лучше: я использую базовые данные в приложении, но также публикую изменения на сервере, отслеживая уведомления из контекста управляемого объекта, чтобы сделать это.

В то же время я периодически опрашиваю сервер на предмет изменений. Когда с сервера приходят изменения, я соответствующим образом обновляю объекты Core Data. Но в этом случае только , я хочу избежать отправки недавно измененных локальных данных обратно на сервер (поскольку именно там они и были получены). Другими словами, либо я хочу подавить уведомление об операции сохранения , либо , когда я получаю это уведомление, я хочу его распознать и проигнорировать.

В настоящее время я не делаю ничего особенного с параллелизмом или потоками. Если это означает, что я могу полагаться на то, что уведомление о сохранении контекста управляемого объекта поступает точно в том же порядке, что и мои операции сохранения, я могу просто установить флаг перед соответствующим сохранением. Будет ли это работать?

(И если это произойдет, то все равно будет грязно, если я когда-нибудь захочу работать асинхронно в будущем. Было бы лучше иметь какой-нибудь способ привязать уведомление обратно к конкретной операции сохранения или вообще отключить уведомления этого сохранения.)

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Это очень интересный вопрос!

Я бы сказал, использовать флаг BOOL, если вы не используете многопоточность.

Если вы используете многопоточность и нацеливание на 10.6+,Вы должны выполнять все операции с основными данными (включая установку этого флага) в одной и той же параллельной последовательной очереди Grand Central Dispatch (или GCD).

Вы можете настроить эту очередь следующим образом:

dispatch_queue_t dataQueue = dispatch_queue_create("Data Queue", DISPATCH_QUEUE_SERIAL);

Затем вы можете выполнить операции Core Data в этой очереди, используя:

dispatch_async(dataQueue, ^{
    //do work here
});

Не забудьте освободить очередь, когда закончите с ней:

dispatch_release(dataQueue);

*Возможно, 1017 * можно использовать в качестве ивара или глобальной переменной, доступ к которой осуществляется с помощью некоторого метода +.

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

Читайте о Grand Central Dispatch (который я лично считаю действительно классным API) в Руководство по программированию параллелизма .

0 голосов
/ 10 марта 2012

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

Ваш метод обратного вызова слияния может выглядеть следующим образом:

- (void)mergeChanges:(NSNotification *)notification {
    if (notification.object != self.context) {
        [self.context mergeChangesFromContextDidSaveNotification:notification];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...