Как смоделировать мои данные CloudKit

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

Итак... В моем приложении пользователи будут иметь несколько проектов. Каждый из них содержит несколько объектов, связанных с этим проектом. Например задачи, а также напоминания и так далее.

Все эти данные будут храниться в личной базе данных пользователей. Ничего не будет в публичной базе данных.

Теперь у пользователя может быть несколько проектов.

Мой первый вопрос: должен ли каждый проект быть в своей собственной CKRecordZone? Я не видел выгоды от этого?!? Может кто-нибудь объяснить мне, в чем преимущество наличия нескольких зон записи? Так что в настоящее время все проекты находятся в ОДНОЙ зоне.

Далее, я бы хотел, чтобы пользователь мог делиться ВСЕМИ своими данными с кем-то еще. В настоящее время проблема заключается в том, что, поскольку проект в настоящее время является корневой записью в моей базе данных, мне нужно создать общий ресурс для каждого из этих проектов, верно?!? В моем приложении не имеет смысла приглашать пользователей в каждый проект отдельно, поэтому я бы хотел как-то это заархивировать. Имеет ли смысл создавать новую корневую запись, в которой проекты являются дочерними, а затем пользователь приглашает кого-то к этой новой корневой записи?

Последний вопрос... есть что-то вроде Sack-Team или так, чтобы задавать вопросы о CloudKit? Казалось бы, это проще, чем начать новый вопрос здесь по stackru, так как мои вопросы довольно специфичны для моего приложения...

1 ответ

Хорошие вопросы Вот что я рекомендую.

зона

Прежде всего, вам нужна только одна зона. Но чтобы поделиться записями из него, это должна быть пользовательская зона (вы не можете использовать _defaultZone). Честно говоря, зоны в CloudKit странные, и я не уверен, почему они существуют. Apple, кажется, передает свои проблемы с осколками баз данных своим разработчикам.:)

Создайте пользовательскую зону следующим образом:

let customZone = CKRecordZone(zoneName: "projectZone")

// Save the zone in the private database
let container = CKContainer(identifier: "...")
let privateDB = container.privateCloudDatabase

privateDB.save(customZone){ zone, error in
  if let error = error{
    print("Zone creation error: \(String(describing: error))")
  }else{
    print("Zone created: \(zone)")
  }
}

Типы записей

Я хотел бы создать типы записей, как это:

  • Project (корневая запись)
  • Task
  • Reminder

разделение

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

Ниже приведен пример того, как вы должны установить эти поля в записях.

//Get a reference to the zone you created
let zoneID = CKRecordZoneID(zoneName: "projectZone", ownerName: CKCurrentUserDefaultName)

//Create a project record
let projectRecord = CKRecord(recordType: "Project", zoneID: zoneID)
projectRecord.setValue("My Cool Project", forKey: "name")

//Create a task record
let taskRecord = CKRecord(recordType: "Task", zoneID: zoneID)
taskRecord.setValue("My Task Name", forKey: "name")

//Create an association between the task and its parent project
let parentReference = CKReference(record: projectRecord, action: .deleteSelf)
taskRecord.setValue(parentReference, forKey: "project")

//When sharing, allow this task to be automatically shared if the parent project is shared
taskRecord.setParent(projectRecord)

Все это предполагает, что вы создаете поля для вашего Project а также Task типы записей name (тип: String). Тогда на Task тип записи, вы бы имели project поле типа Reference,

Я надеюсь, что это поможет и, по крайней мере, поможет вам начать. Я не знаю о канале CloudKit Slack, но если вы услышите об этом, дайте мне знать!:)

Другие вопросы по тегам