比方说,我有一个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订阅,您可以将一些订阅与核心数据组合在一起,并使用提取的结果控制器来处理一个很好的解决方案。你甚至可以用后台更新一些数据。 –