Parse.com 有一个 saveEventually 选项,可将数据存储到磁盘并等待网络连接继续并将其保存到服务器。
但是,有时当网络连接可用并且用户快速切换屏幕时,新数据尚未保存到服务器,导致 View 显示旧数据。
对于 parse.com 用户,当我运行新的 query 并且 saveEventually 调用尚未完成时会发生这种情况。
我想实现自己的缓存系统。
我想在完成后用回调调用 saveEventually ,然后我会删除缓存的数据。
这样,我可以在建立网络连接之前先检查是否有缓存数据。
我想我可以使用 NSCache 和 NSDiscardableContent 来做到这一点,我已经阅读了文档,但如果我能看到一些用于创建的简单示例代码,它真的会对我有所帮助这些对象并将它们存储在用户的设备上。
有什么建议吗?
更新:
好的,这是一个变通解决方案的想法。
我调用 saveEventually 的每个对象都将添加到 NSArray 并将其存储在 documentsDirectory 中,然后在 saveEventually 完成我将删除documentsDirectory 中的array 。
如果应用程序在完成之前关闭,我不会得到 callback 但这不会有问题,因为我将在服务器上执行查询并获取存储的 NSArray 在设备中,然后我将创建一个唯一数组,优先考虑 documentsDirectory 中的对象。
我认为这可行。我担心的是它是否会使我的应用程序变慢。
有什么想法吗?
Best Answer-推荐答案 strong>
我还没有尝试过,但是如何设置查询的缓存策略,例如:
query.cachePolicy = kPFCachePolicyCacheElseNetwork;
如果 saveEventually 使用的是常规解析缓存,那么它应该做你想做的事。
编辑 - 由于上述显然行不通,我可以想出几种方案来使用您自己的缓存,但它们都陷入了基本的竞争条件问题:假设您保存最终,然后再次查询。假设您已修复查询代码以获取最终保存的本地对象。
如果您修改该缓存对象并最终(再次)保存它会怎样?我们是否知道 parse 会正确序列化两次保存?
如果您对此并不担心(也许第二个查询永远不会生成保存,或者您愿意在比赛条件下掷骰子),那么您有很多选择。让我们直截了当:
使用 NSCache 属性创建一个单例。给出在它的公共(public)接口(interface)中的这些方法...
// call this instead of saveEventually
- (void)cacheThenSaveEventuallyNSArray *)pfObjects {
for (PFObject *object in pfObjects) {
[self.cache setObjectbject forKey:[object objectId]];
[object saveEventually:^(BOOL success) {
if (success) [self.cache removeObjectForKey:[object objectId]];
}];
}
}
// call this with the result of a query that might have been in a race with saveEventually
- (NSArray *)freshenUpResultsNSArray *)pfObjects {
NSMutableArray *fresherObjects = [NSMutableArray array];
for (PFObject *object in pfObjects) {
PFObject *fresher = [self.cache objectForKey:[object objectId]];
[fresherObjects addObjectfresher)? fresher : object];
}
return [NSArray arrayWithArray:fresherObjects];
}
关于ios - Parse.com saveEventually 带有回调并使用 NSCache 来存储数据,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/25143199/
|