Kotlin/Swift (iOS) Туда и Обратно
36 subscribers
129 photos
21 videos
9 files
86 links
Канал - журнал, рассказывающий об опыте изучения Swift & iOS backend-разработчиком на Java & Kotlin
Download Telegram
Ещё раз про CloudKit

Кажется, я изначально неправильно понял, как работает эта технология.

Основываясь на уроках Hacking with Swift, я предположил, что механизм синхронизации “встроен”. И это действительно так - но только для приватной базы, связанной с конкретным пользователем.

Я думал, что если добавить записи в дашборде CloudKit, они автоматически подтянутся в приложение. И что в коде можно будет как-то отреагировать на приход новых данных, например, callbacks.

Оказалось, что данные из публичной базы нужно явно запрашивать. Никакой “магии” синхронизации тут нет.

Вот пример моей рабочей реализации, которая действительно получает записи, созданные через CloudKit Dashboard:

class CloudKitManager: ObservableObject {
private let database = CKContainer.default().publicCloudDatabase

@Published var words: [WordDto] = []

func fetchWords() {
print("Fetching words from NounWord record type...")
let query = CKQuery(recordType: "NounWord", predicate: NSPredicate(value: true))
let queryOperation = CKQueryOperation(query: query)

var fetchedWords: [WordDto] = []

queryOperation.recordMatchedBlock = { id, result in
switch result {
case .failure(let error):
print("Failed to load word with id \(id): \(error.localizedDescription)")
return
case .success(let record):
guard let word = record["word"] as? String else { return }
guard let articleString = record["article"] as? String else { return }
let dto = WordDto(id: record.recordID.recordName, word: word, article: NounArticle(rawValue: articleString)!, exampleSentences: [])
fetchedWords.append(dto)
}
}

queryOperation.queryResultBlock = { result in
print("Notifying UI about fetched words...")
DispatchQueue.main.async {
switch result {
case .success:
self.words = fetchedWords
case .failure(let error):
print("Error fetching words: \(error.localizedDescription)")
}
}
}

database.add(queryOperation)
}
}


Ещё в придачу, CloudKit API постоянно устаревает, и код взятый из примеров подсвечивается как deprecated…

#cloudkit
🤔1