Основные данные - сохранение в постоянном хранилище на диске в фоновом режиме - PullRequest
1 голос
/ 04 ноября 2010

Я надеюсь, что кто-то сможет дать быстрый ответ на этот вопрос, он, вероятно, будет действительно очевидным, но я просто не могу обдумать это.

У меня есть приложение для Mac, в котором я использую Core Data для сохранения информации. Все это работает нормально, и когда я создаю новые данные, они хорошо отображаются в приложении, а когда я закрываю приложение, [managedObjectContext save: & error] вызывается успешно и данные сохраняются в постоянном хранилище на диске. *

То, что я хочу сделать, - это сохранять основные данные в любое время при изменении любой информации. Причина этого заключается в том, чтобы предотвратить любую потерю данных в случае сбоя приложения, и, поскольку я буду предоставлять пользователям возможность сохранять данные в dropbox / idisk, было бы неплохо сразу сохранить информацию, так как изменения должны появиться в другие компьютеры, к которым они обращаются с теми же данными.

До сих пор я нашел следующее, используя NSNotificationCenter:

[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(saveDatabaseInBackground)
name:NSManagedObjectContextObjectsDidChangeNotification
object:managedObjectContext];

Который при каждом изменении данных успешно вызывает:

- (void) saveDatabaseInBackground
{
    NSError *error = nil;
    if ([managedObjectContext hasChanges])
    {
        [managedObjectContext save:&error];
    }
}

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

Кто-нибудь есть какие-либо идеи о том, как решить?

Спасибо

Rob

1 Ответ

1 голос
/ 04 ноября 2010

Нет разрешения для использования этого уведомления для сохранения вашего управляемого объекта.NSManagedObjectContextObjectsDidChangeNotification публикуется в процессе processPendingChanges после обработки изменений, но перед безопасным вызовом save.Если вы попытаетесь, вы сгенерируете бесконечный цикл - как вы обнаружили.Это упоминается в документации к уведомлению.

Требуется автоматическое сохранение данных, чтобы при сбое ничего не потерялось.Я прошел аналогичный процесс для своего приложения - которое входит в топ-50 в магазине приложений по производительности и также включает синхронизацию с Dropbox - и определил, что в большинстве случаев я изучал почти немедленное сохранениеизмененные данные, как правило, достаточно хороши.Вместо того, чтобы пытаться сохранить момент, что-либо на объекте изменяется, почему бы не проверять изменения каждые n секунд и сохранять при необходимости?Установите таймер и проверьте ваш объект на наличие обновлений.Это довольно просто, но есть несколько ошибок, за которыми нужно следить, например, не пытаться сохранить, если сохранение уже выполняется.Это особенно важно при синхронизации с такими службами, как dropbox, для синхронизации которых может потребоваться значительное время.

Если вам нужен более подробный код для настройки таймера, проверки управляемого объекта и сохранения, я буду счастливсделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...