Я последний раз смотрел WWDC 2016 Что нового в CloudKit, чтобы понять, как делиться записями с другие пользователи, использующие CKShare
Совместное использование одной записи:
Я могу поделиться и получить одну запись
т.е. если [email protected] создал и поделился одной записью с [email protected]
Совместное использование нескольких записей:
допустим, есть 10 записей, и [email protected] хочет поделиться на [email protected]. Я столкнулся с проблемой, когда пользователь [email protected] делится несколькими записями с пользователем [email protected]
Что я пробовал до сих пор:
Сначала я создал 3 записи заметок:
Примечание 1
Note2 (установить родителя как Note1)
Note3 (установить родителя как Note1)
Я поделился Note1 (родительская запись) с приведенным ниже кодом:
КОД - Поделиться записью
let controller = UICloudSharingController { controller,
preparationCompletionHandler in
let share = CKShare(rootRecord: self.parentRecord!)
share[CKShareTitleKey] = "note" as CKRecordValue
share.publicPermission = .readOnly
let operation = CKModifyRecordsOperation(
recordsToSave: [self.parentRecord!, share],
recordIDsToDelete: nil)
operation.perRecordCompletionBlock = { (record, error) in
if let error = error {
print("CloudKit error: \(error.localizedDescription)")
}
}
operation.modifyRecordsCompletionBlock = { records, recordIDs, error in
if error != nil {
print(error?.localizedDescription ?? "Error")
} else{
print("Success")
preparationCompletionHandler(share,CKContainer.default(), error)
}
}
CKContainer.default().privateCloudDatabase.add(operation)
}
controller.availablePermissions = [.allowPrivate, .allowReadOnly]
controller.delegate = self
present(controller, animated: true)
и получил общую заметку с приведенным ниже кодом:
КОД - Чтение данных из общей заметки
func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShareMetadata) {
let acceptSharesOperation = CKAcceptSharesOperation(
shareMetadatas: [cloudKitShareMetadata])
acceptSharesOperation.perShareCompletionBlock = {
metadata, share, error in
if error != nil {
print(error?.localizedDescription)
} else {
let operation = CKFetchRecordsOperation(
recordIDs: [cloudKitShareMetadata.rootRecordID])
operation.perRecordCompletionBlock = { record, _, error in
if error != nil {
print(error?.localizedDescription)
}
if let shareRecord = record {
DispatchQueue.main.async() {
// Shared record successfully fetched. Update user
// interface here to present to user.
print("\(shareRecord["id"]!)") // id of note
print("\(shareRecord["text"])") // text of note
print("Shared record successfully fetched")
}
}
}
operation.fetchRecordsCompletionBlock = { (recordsWithRecordIDs,error) in
if error != nil {
print(error?.localizedDescription)
}else {
if let recordsWithRecordIDs = recordsWithRecordIDs {
print("Count \(recordsWithRecordIDs.count)")
}
}
}
CKContainer.default().sharedCloudDatabase.add(operation)
}
}
CKContainer(identifier: cloudKitShareMetadata.containerIdentifier)
.add(acceptSharesOperation)
}
Вышеупомянутый метод дает только данные родительской заметки (только корень / родитель)
Запросы:
1) Как получить записи других детей? (Я использовал термин дети для понимания цели)
2) Нужно ли каждый раз проверять, есть ли новые общие записи или нет?
Поскольку я не нашел хороших руководств и исходников из официальных документов Apple. Не могли бы вы предложить мне способ обмена и извлечения нескольких записей?
Заранее спасибо..!
CKFetchRecordZonesOperation
возвращает фактически измененные записи? А у вас где-нибудь есть такой пример? Спасибо! 13.06.2018