Атрибут CKReference .DeleteSelf не имеет никакого эффекта
Как реально работает.DeleteSelf? Документы говорят:
Когда для действия ссылочного объекта установлено значение CKReferenceActionDeleteSelf, целевой объект ссылки, то есть запись, сохраненная в свойстве recordID ссылки, становится владельцем исходной записи. При удалении целевой записи (владельца) удаляются все ее исходные записи.
но у меня сложилось впечатление, что удаление цели не всегда удаляет источник. И это довольно раздражает, когда он остается в контейнере, клиент загружает его и ожидает, что эталонная точка куда-то, но цель не существует при создании части хранилища данных сервера на клиенте?
Как вы относитесь к этому делу? Вы игнорируете такие записи? Или вы периодически просматриваете хранилище CloudKit, ища поврежденные записи, чтобы удалить их?
Или вместо удаления записи лучше установить атрибут, который находится в удаленном состоянии, но сохранить его в базе данных?
2 ответа
Я боролся с этим какое-то время и думал, что поделюсь своими результатами...
Это принципиально вопрос разрешения. Каскадное удаление будет работать только в том случае, если пользователь, удаляющий записи, имеет права "записи" для всех записей, которые необходимо удалить. Таким образом, в инструментальной панели CloudKit каскадное удаление будет работать только для записей, созданных с помощью учетной записи разработчика iCloud.
Если вам нужно удалить записи, которые не принадлежат пользователю, удаляющему их, вы можете добавить разрешения на "запись" для типа записи в разделе "Безопасность".
Если вы удаляете через CloudKit Dashboard, вам нужно подождать, прежде чем переключать типы записей, чтобы проверить другой конец ссылки. Скорее всего, вы переключились до того, как действительно произошло удаление. Вы можете использовать веб-инспектор Safari на вкладке "Сеть", чтобы проверить, когда удаление действительно завершилось. Удаление нескольких записей занимает очень много времени.