Как смоделировать мои данные CloudKit - PullRequest
0 голосов
/ 28 августа 2018

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 30 августа 2018

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

Зона

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...