Parse.com使用回调保存,并使用NSCache存储数据

时间:2014-08-05 15:53:46

标签: ios objective-c caching parse-platform

Parse.com有一个saveEventually选项,用于将数据存储到光盘并等待网络连接继续并将其保存到服务器。

但是,有时当网络连接可用且用户快速切换屏幕时,新数据尚未保存到服务器,导致视图显示旧数据。

对于parse.com用户,当我运行新的querysaveEventually来电尚未完成时,就会发生这种情况。

我想实现自己的缓存系统。

我想在完成时调用saveEventually回调,然后我会删除缓存的数据。

这样,在进行网络连接之前,我可以先检查是否有缓存数据。

我想我可以使用NSCacheNSDiscardableContent来做,我已经阅读了文档,但如果我能看到一些简单的示例代码来创建这些对象并将其存储在用户的设备。

有什么建议吗?

更新:

好的,这是一个解决方法的想法。

我在{I}上调用saveEventually的每个对象都会添加到NSArray并将其存储在documentsDirectory中,然后,在saveEventually完成后,我将删除{{1}在array中。

如果应用程序在完成之前关闭,我就不会得到documentsDirectory,但这不会有问题,因为我将在服务器上执行查询并将设备中存储的callback作为好吧,然后我会创建一个唯一的数组,优先考虑NSArray中的对象。

我认为这可行。我担心的是它是否会使我的应用程序变慢。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我没有试过这个,但是如何设置查询的缓存策略,如:

query.cachePolicy = kPFCachePolicyCacheElseNetwork;

如果saveEventually正在使用常规解析缓存,那么它应该只是你想要的。

编辑 - 由于以上显然不起作用,我可以考虑使用自己的缓存的几种方案,但他们都陷入了根本的竞争条件问题:说你节省最终,然后再次查询。假设您已修复查询代码以获取最终保存的本地对象。

如果您修改该缓存对象并最终(再次)保存它会怎样?我们是否知道解析会正确序列化两个保存?

如果你不担心这个问题(也许第二个查询永远不会产生保存,或者你愿意在比赛条件下掷骰子),那么你有很多选择。让我们采取直截了当的一个:

使用NSCache属性创建单例。给出这些公共接口中的方法......

// call this instead of saveEventually
- (void)cacheThenSaveEventually:(NSArray *)pfObjects {
    for (PFObject *object in pfObjects) {
        [self.cache setObject:object 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 *)freshenUpResults:(NSArray *)pfObjects {
    NSMutableArray *fresherObjects = [NSMutableArray array];
    for (PFObject *object in pfObjects) {
        PFObject *fresher = [self.cache objectForKey:[object objectId]];
        [fresherObjects addObject:(fresher)? fresher : object];
    }
    return [NSArray arrayWithArray:fresherObjects];
}