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

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

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

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

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

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

Мои вопросы:

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

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

2 Solutions collect form web for “CloudKit: предотвращение дублирования записей”

ответы:

  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 Core Data "нет документа по URL"
  • Основные данные с дизайном iCloud
  • iCloud: Обратный вызов для запуска NSFileManagerUwningUbiquitousItemAtURL?
  • В приложении отсутствует требуемое право com.apple.developer.icloud-services '
  • Как заставить приложение cloudkit загружать данные в качестве загрузки?
  • Вопросы по данным iCloud + core
  • iCloud ubiquityIdentityToken эквивалент в iOS5
  • iCloud NSMetadataQuery и обновления (NSMetadataQueryUpdateChangedItemsKey)
  • Разрешение пользователю редактировать / просматривать существующие документы, когда iCloud становится недоступным
  • Как открыть UIDocument после того, как существует UIDocumentStateSavingError?
  • Не-iCloud использование UIDocument
  • Interesting Posts

    Понимание перечисления C ++ через UIInterfaceOrientationMask для Objective-C / iOS

    анимация похожа на открытие приложения в ios7

    Почему в Xcode могут быть созданы группы, но не настоящие папки?

    Firebase withCompletionBlock не вызывается, если нет соединения

    Защита данных iOS не работает с уже установленным приложением

    Использование NSKeyValueObservation для наблюдения за значением в UserDefaults

    включить отсканировку только для одного направления UITableView

    UIViewController viewDidLoad

    Отображение предупреждения в Swift вызывает EXC BAD ACCESS

    Пользовательский сервер GoogleAuthCode nil в Objective-C

    Как преобразовать время String в NSDate?

    Отвечайте на элементы управления Apple TV во время воспроизведения видео

    presentViewController, работающий в iOS 6, но не отображающий представление в iOS 5

    Заставить iPhone читать данные через разъем для наушников

    ios изменить блокировку экрана тип уведомления форма баннер для типа оповещения

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.