CloudKit: предотвращение дублирования записей

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

Каждая запись в моих внешних данных имеет уникальный идентификатор, который я сопоставляю с экземплярами CKRecord. Общий поток запуска приложения:

  1. Извлечь текущие CKRecords для соответствующего типа записи.
  2. Извлеките внешние записи.
  3. Для каждой внешней записи, если она не существует в CloudKit, создайте ее с помощью пакетного создания (операция модификации).

Теперь проблема заключается в том, что если этот процесс запускается на двух устройствах пользователя одновременно, так как CK и внешняя выборка являются асинхронными, есть большая вероятность, что я получу дубликаты записей.

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

Мои вопросы:

  1. Кто-нибудь знает, как «заблокировать» личную базу данных для записи на всех устройствах пользователя?
  2. Альтернативно, существует ли способ обеспечить уникальность в любом поле CKRecord?
  3. Или существует способ использования пользовательского значения в качестве первичного ключа, в этом случае я мог бы использовать мой внешний идентификатор в качестве идентификатора CK и позволить системе предотвращать дублирование.

Спасибо за помощь в продвижении!

ответы:

  1. Нет, вы не можете заблокировать частную базу данных
  2. Cloudkit уже применяет и предполагает уникальность идентификатора вашей записи
  3. Вы можете сделать идентификатор записи любым, что вам нравится (в неонной части).

Объяснение:

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

Код:

//employeeID is a unique ID to identify an employee let employeeID = "001" //Remember the recordID needs to be unique within the same database. //Assuming you have different record types, it is better to prefix the record name with the record type so that it is unique let recordName = "Employee-\(employeeID)" //If you are using a custom zone let customZoneID = CKRecordZoneID(zoneName: "SomeCustomZone", ownerName: CKCurrentUserDefaultName) let recordIDInCustomZone = CKRecordID(recordName: recordName, zoneID: customZoneID) //If you are using the default zone let recordIDInDefaultZone = CKRecordID(recordName: recordName) 

У меня была аналогичная проблема с дубликатами, загружаемыми, когда я пытался читать в базе данных более 100 записей; решение найдено в примере Apple Atlas, в котором используется логическое значение, чтобы проверить, завершился ли последний процесс до того, как он запустит следующий. Вы найдете такой блок …

 @synchronized (self) { // Quickly returns if another loadNextBatch is running or we have the oldest post if(self.isLoadingBatch || self.haveOldestPost) return; else self.isLoadingBatch = YES; } 

Кстати, здесь код для создания собственного ключа записи.

 CKRecordID *customID = [[CKRecordID alloc] initWithRecordName: [globalEOConfirmed returnEOKey:i]]; newrecord = [[CKRecord alloc] initWithRecordType:@"Blah" recordID:customID]; 
  • Ошибка iCloud Cocoa 512
  • PHAsset с оптимизацией хранилища IPhone
  • Расширение iOS 8 с использованием данных iCloud
  • Вопросы по данным iCloud + core
  • Чтение исходных данных MPMediaItem из элемента iCloud
  • Как получить EKSource для iCloud?
  • iOS - Как проверить, открыт ли UIDocument в другом месте iCloud?
  • Можно ли использовать NSMetadataQuery, когда iCloud отключен?
  • Мое приложение разбивается на UIDocumentPickerViewController
  • Можно ли использовать NSUbiquitousKeyValueStore в iOS 7 или iOS 8 Simulator?
  • Дождитесь загрузки файла перед запуском функции Swift
  • Давайте будем гением компьютера.