比方說,我有一個CKRecord
的recordType
後。發佈後會保留一些值,如標題和說明。當應用程序中顯示帖子時,會附上寫它的用戶的姓名和個人資料圖片(我們稱他們爲Writer)。我的問題是 - 將CKReference
存儲到Writer的配置文件(配置文件是保存Writer詳細信息的另一種類型的記錄)最好嗎?還是在寫作時直接將作者的詳細信息添加到Post中?使用CKReference與CKRecord的CloudKit性能
從數據庫模式的角度來看,第一個選項非常有意義,但從性能角度來看,它似乎非常糟糕。在這個系統中有成千上萬的用戶,提取數量和加載時間似乎都不合理。
第一部分涉及加載所有帖子。
func loadPosts() {
// ...Setup the query
publicData.performQuery(query, inZoneWithID: nil) { (results: [CKRecord]?, error: NSError?) in
if let posts = results {
self.loadProfiles(posts)
}
}
}
一個查詢完成,現在我們叫loadProfiles
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)
}
在該函數中,我們花費的時間抓住referenceIDs。然後,我們花時間進行配置文件提取。請注意,所有這些都是在原始的Post取回之後發生的!
...是的。即使有某種緩存系統,原始的抓取也會很瘋狂(特別是對於很多用戶)。
那麼,在他們寫作時直接將寫作者的細節添加到帖子中會更好嗎?優點:更少的抓取,更快的加載速度。缺點:如果編寫者改變他們的個人資料的詳細信息,應用程序將不得不遍歷他們的所有帖子,並手動更新細節。
這整個兩難困境挑選你的毒藥情景。有一個更好的方法嗎?
我絕對建議參考,據我記錄的表現。創建某種類型的本地緩存系統,然後在它的版本與您自己的版本不同時更新每個數據並更新它,可能是通過訂閱通知。也就是說,這可能不是這個問題的最佳論壇,你可能在programmers.stackexchange.com或蘋果開發論壇上運氣更好。 –
@thefredelement核心數據與某種通知來更新持久存儲是有道理的。但是,原始的抓取仍然很長。我選擇了StackOverflow而不是程序員,因爲我有代碼級別的實現。我希望有一個更好的方法來重構這個,而不必徹底改變廣泛的結構。 –
查看CloudKit訂閱,您可以將一些訂閱與核心數據組合在一起,並使用提取的結果控制器來處理一個很好的解決方案。你甚至可以用後臺更新一些數據。 –