Установите атрибут lastModificationDate после того, как NSManagedObjectsDidChangeNotification создает бесконечный цикл

Я добавил атрибут lastModifiedDate ко всем моим объектам, чтобы избежать дублирования при синхронизации UIManagedDocument с iCloud, что-то, что я обнаружил, может произойти, если я создам новые объекты с автономным устройством (iPad) и одновременно создаю те же объекты используя другое онлайн-устройство (iPhone).

Я хотел установить этот атрибут всякий раз, когда изменяется объект, поэтому я подписался на NSManagedObjectContextObjectsDidChangeNotification . Код, который я написал для установки lastModifiedDate, создает бесконечный цикл, потому что, устанавливая атрибут lastModificationDate, он создает изменение, которое будет снова уведомлено NSManagedObjectContextObjectsDidChangeNotification и так далее …

Можно ли это исправить? Есть ли лучший способ достичь моей цели? Должен ли я подкласс managedObjectContext и переопределять willSave:

 //At init... [[NSNotificationCenter defaultCenter] addObserver:applicationDatabase selector:@selector(objectsDidChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:applicationDatabase.managedDocument.managedObjectContext]; (void) objectsDidChange: (NSNotification*) note { // creates an infinite loop NSDate *dateOfTheLastModification = [NSDate date]; NSMutableArray *userInfoKeys = [[note.userInfo allKeys] mutableCopy]; for(int i=0; i< userInfoKeys.count;i++){ NSString *key = [userInfoKeys objectAtIndex:i]; if([key isEqualToString:@"managedObjectContext"]){ [userInfoKeys removeObject:key]; } } for(NSString *key in userInfoKeys){ NSArray *detail = [note.userInfo objectForKey:key]; for (id object in detail){ [object setValue:dateOfTheLastModification forKey:@"lastModifiedDate"]; } } 

Чтобы избежать бесконечного цикла, вы можете установить дату последней модификации с помощью примитивного элемента доступа :

 [object setPrimitiveValue:dateOfTheLastModification forKey:@"lastModifiedDate"]; 

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

Переопределение willSave в подклассе управляемого объекта будет willSave одинаковую проблему. Документация Apple для состояний willSave :

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

Поэтому вы должны зарегистрироваться вместо NSManagedObjectContextWillSaveNotification и установить временную метку для всех обновленных и вставленных объектов в контексте управляемого объекта. Зарегистрированный метод может выглядеть так:

 -(void)contextWillSave:(NSNotification *)notify { NSManagedObjectContext *context = [notify object]; NSDate *dateOfTheLastModification = [NSDate date]; for (NSManagedObject *obj in [context insertedObjects]) { [obj setValue:dateOfTheLastModification forKey:@"lastModifiedDate"]; } for (NSManagedObject *obj in [context updatedObjects]) { [obj setValue:dateOfTheLastModification forKey:@"lastModifiedDate"]; } } 

Это предполагает, что все ваши сущности имеют атрибут lastModifiedDate , в противном случае вы должны проверить класс объектов.

  • Основные данные - UIManagedDocument не открывается
  • Основные данные и iOS 7: различное поведение постоянного хранилища
  • UIManagedDocument и основные данные
  • Может создавать, но не открывать, UIManagedDocument с поддержкой iCloud
  • CoreData Stack Vs UIManagedDocument для приложений iCloud
  • CoreDataTableView не обновляется при сохранении с дочерним ManagedObjectContext и родительский ManagedObjectContext
  • Можно ли заменить хранилище CoreData persistantStore NSFileManager?
  • Ошибка в iPhone Simulator 5.1 с Xcode 4.5 с использованием UIManagedDocument
  • Убедитесь, что UI (управляемый) документ уже находится в iCloud через URLForUbiquityContainerIdentifier + Path вместо NSMetadataQuery?
  • Не удалось создать UIManagedDocument
  • UIDocument openWithCompletionHandler не завершается на устройстве iOS
  • Interesting Posts

    iOS: использование Facebook и Google, вход в Google Plus

    Неверное решение GCD производителя-потребителя Apple doc?

    RestKit: управляемый объект, отображаемый внутри простого объекта Objective-C

    Улучшение качества изображения библиотеки фотографий ALAsset при медленном ее загрузке

    Отчеты о сбоях iOS, например, во время бета-тестирования

    Почему всего лишь 5 секунд игры UNNotificationSound

    изменить значение Uislider при нажатии на определенную точку

    Разрешить открывать ics в приложении phonegap для iOS

    pre select / highlight UICollectionViewCell при первой загрузке представления

    CloudKit делится частным контейнером между пользователями

    relocatable dylib (например, встроенные фреймворки) поддерживаются только на iOS 8.0 и более поздних версиях (@ rpath / libswift_stdlib_core.dylib)

    Почему он возвращает nil, когда я разворачиваю массив строк в localNotification?

    Добавление изображений в массив

    Можно ли форматировать dateComponent для отображения в виде hh: mm: ss?

    Ошибка AUIOClient_StartIO (-66628) во время работы на устройстве iPhone

    Давайте будем гением компьютера.