Хорошие вопросы. Вот что я рекомендую.
Зона
Прежде всего, вам нужна только одна зона. Но чтобы поделиться записями из него, это должна быть пользовательская зона (вы не можете использовать _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
s для каждого потомка отдельно.
Ниже приведен пример, который показывает, как бы вы установили эти поля в записях.
//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, но если вы услышите об этом, дайте мне знать! :)