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]; 
  • Приложение отклонено из-за хранения данных - как я могу заставить его игнорировать все мои файлы в папке?
  • NSMetadataQuery игнорирует тип пользовательского файла
  • Изменение контейнера iOS 8 iCloud
  • Установите атрибут lastModificationDate после того, как NSManagedObjectsDidChangeNotification создает бесконечный цикл
  • Создать идентификатор iCloud в панели разработчиков iOS
  • iCloud Core Data "нет документа по URL"
  • Есть ли ограничение на количество записей CKReferenced в CloudKit?
  • Core Data не загружает все данные из iCloud
  • URLForUbiquityContainerIdentifier возвращает нуль, даже если правильно настроен
  • Перенос существующих основных данных в iCloud
  • iCloud & NSFileWrapper: отображение в качестве 2 разных файлов в настройках
  • Interesting Posts

    UANpplication -canOpenURL: -openURL: вернуть неверный результат

    Анимация многократного смешивания двух изображений

    Удалить правило для дочернего объекта в основных данных

    Как удалить сероватый вид раздробленного UIButton

    CGAffineTransformMakeScale на UITextView

    Проблема с NSSearchPathForDirectoriesInDomains и постоянными данными

    Как задержать событие в xcode?

    Как сравнить два образца голоса в iOS?

    Неудачное обнаружение запуска первого приложения, как мне это сделать?

    Как установить делегат панели поиска viewController с помощью расширения?

    Как узнать, воспроизводит ли WKWebView аудио?

    Проблема с вертикальным интервалом с графикой SVG, отображаемая в UIWebView при использовании viewBox

    xcode 7.1 для iOS 9 отсутствует libc ++. dylib требуется для Objective C Realm Static Framework

    Использование ASIHTTPRequest для вложенных параметров POST с использованием NSDictionary

    Воспроизведение HLS m3u8 на iOS 9

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