CKRecord
がrecordType
の投稿を持っているとします。投稿には、タイトルや説明などのいくつかの値があります。投稿がアプリに表示されると、それを書いたユーザーの名前とプロフィールの図が表示されます(ライターと呼ぶ)。私の質問は、CKReference
をライターのプロファイルに保存する方が良いでしょうか(プロファイルはライターの詳細を保持する別のタイプのレコードです)、ライターの詳細を投稿時に直接投稿する方が良いでしょうか?CKReference vs. CKRecordを使用したCloudKitのパフォーマンス
最初のオプションはデータベーススキーマの観点からは理にかなっていますが、パフォーマンスの観点からは本当に悪いようです。このシステムには何千人ものユーザーがいるため、フェッチの量とそれらをロードする時間はすべて不合理なようです。
最初の部分はすべての投稿を読み込むことです。クエリが行わ
func loadPosts() {
// ...Setup the query
publicData.performQuery(query, inZoneWithID: nil) { (results: [CKRecord]?, error: NSError?) in
if let posts = results {
self.loadProfiles(posts)
}
}
}
一つは、今、私たちは、私たちはreferenceIDsをつかん時間を費やし、その関数で
func loadProfiles(posts: [CKRecord]) {
// Get the reference IDs out of the Posts
var referenceIDs = [CKRecordID]()
for post in posts {
// Get the reference from the post
// Append the recordID to the referenceIDs array
}
// Perform the Profiles fetch
let fetchOperation = CKFetchRecordsOperation(recordIDs: referenceIDs)
fetchOperation.fetchRecordsCompletionBlock = { records, error in
// ...Handle the fetched Profiles
// Everything has been fetched, update the UI now
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
})
}
CKContainer.defaultContainer().publicCloudDatabase.addOperation(fetchOperation)
}
loadProfiles
と呼ばれます。その後、プロフィールの取得に時間を費やしました。元のポストフェッチの後で、これがすべて起こっていることを覚えておいてください!
... Yikes。何らかのキャッシュシステムがあっても、オリジナルのフェッチは狂っているでしょう(特に多くのユーザーがいると)。
したがって、書き込み時に投稿者の詳細を投稿に直接追加する方が良いでしょうか?これの長所:フェッチが少なく、読み込みが高速です。これの短所:ライターがプロフィールの詳細を変更した場合、アプリはすべての投稿をループして詳細を手動で更新する必要があります。
このジレンマ全体があなたの毒のシナリオを選んでいます。これを行うより良い方法はありますか?
私は絶対に参考にしたいと思います。いくつかのタイプのローカルキャッシュシステムを作成し、それがバージョンと異なる場合は各自のデータを取得し、おそらくサブスクリプション通知を通じて更新します。それはおそらくこれがこの質問のための最善のフォーラムではないと言われていますが、あなたはプログラマーにもっと良い運を与えるかもしれません.stackexchange.comまたはアップルのdevフォーラム。 –
@thefredelement永続的なストアを更新するための何らかの通知を持つCore Dataは理にかなっています。ただし、元のフェッチはまだ長くなります。コードレベルの実装があるので、私はプログラマーよりもStackOverflowを選択しました。私は広い構造を完全に見直すことなく、これを再構築するより良い方法があると期待しています。 –
CloudKitサブスクリプションをチェックすると、フェッチされた結果コントローラを持つコアデータを含むサブスクリプションのコンボを使用して、すばらしいソリューションを利用できます。 1つは、バックグラウンドでいくつかのデータを更新することさえできます。 –