2014-08-28 6 views
0

У меня есть приложения (iOS и Mac), которые используют iCloud и CoreData (тот же контейнер). Каждое устройство может создавать или обновлять данные. Когда устройство создает или обновляет управляемый объект, другим устройствам необходимо в конечном итоге выполнить определенное действие (не связанное с пользовательским интерфейсом), связанное с управляемым объектом.Идентификация обновлений iCloud coreData: хорошая практика

Так, например,

  • устройство 1 отсутствует,
  • устройства 2 онлайн и изменяет управляемый объект.
  • Позже устройство 1 находится в режиме онлайн: оно должно идентифицировать созданные и обновленные управляемые объекты для выполнения определенных действий.

Мой вопрос: могу ли я полагаться на систему уведомлений, чтобы достичь этого? (NSPersistentStoreCoordinatorStoresDidChangeNotification и NSPersistentStoreDidImportUbiquitousContentChangesNotification)

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

Или этот тип требований должен быть реализован с помощью моего собственного механизма для идентификации изменений в магазине? (Что усложнит модель, потому что каждое устройство будет иметь знать, что он обработал обновление конкретного управляемого объекта)

Edit: Увидел это предложение here: импортирует

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

Это говорит мне, что уведомления надежны для этого.

ответ

1

Основываясь на моем опыте, уведомления надежны. Изменения в iCloud будут синхронизироваться только во время работы вашего приложения. Эта синхронизация будет также возникать только после того, как вы добавите соответствующее постоянное хранилище. (т. е. вы вызывали addPersistentStoreWithType в своем постоянном координаторе хранилища).

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

// Returns the persistent store coordinator for the application. 
// If the coordinator doesn't already exist, it is created and the application's store added to it. 
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    } 

    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

    NSNotificationCenter* notificationCentre = [NSNotificationCenter defaultCenter]; 

    [notificationCentre addObserver:self 
          selector:@selector(CoreData_StoresWillChange:) 
           name:NSPersistentStoreCoordinatorStoresWillChangeNotification 
          object:coordinator]; 
    [notificationCentre addObserver:self 
          selector:@selector(CoreData_StoresDidChange:) 
           name:NSPersistentStoreCoordinatorStoresDidChangeNotification 
          object:coordinator]; 
    [notificationCentre addObserver:self 
          selector:@selector(CoreData_StoreDidImportUbiquitousContentChanges:) 
           name:NSPersistentStoreDidImportUbiquitousContentChangesNotification 
          object:coordinator]; 

    NSMutableDictionary* workingOptions = [self.storeOptions mutableCopy]; 

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.storeURL options:workingOptions error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return _persistentStoreCoordinator; 
} 
+0

Спасибо за ваш ответ. Один вопрос об этом утверждении: _I всегда регистрирую уведомления (код, показанный ниже) перед добавлением моего постоянного хранилища_. Если регистрация выполняется в том же цикле выполнения очереди, сразу после добавления хранилища, могут ли быть пропущены уведомления? – CMont

+0

Я считаю, что маловероятно, чтобы вы пропустили уведомления в этом случае. Тем не менее, синхронизация iCloud работает в своем потоке. Окно времени, вероятно, настолько узкое, что вы никогда не пропустите уведомление, но я предпочитаю играть в него безопасно. –

+0

Я, похоже, следовал точно описанному выше образцу. Пока только одно устройство отключено, все работает нормально.Однако, когда оба устройства находятся в автономном режиме, и новый объект добавляется в хранилище, уведомление не появляется, когда оба устройства возвращаются в сеть, поэтому синхронизация не происходит. Тем не менее, я не уверен, что ни одно из уведомлений не выдано ни при одном автономном состоянии устройства, либо если устройство два не может его получить. По крайней мере, ничего не получено, когда оба устройства снова подключены к сети. Спасибо за любые предложения! – DoertyDoerk

Смежные вопросы