• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - Parse.com saveEventually 带有回调并使用 NSCache 来存储数据

[复制链接]
菜鸟教程小白 发表于 2022-12-13 00:21:23 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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

对于 parse.com 用户,当我运行新的 query 并且 saveEventually 调用尚未完成时会发生这种情况。

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

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

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

我想我可以使用 NSCacheNSDiscardableContent 来做到这一点,我已经阅读了文档,但如果我能看到一些用于创建的简单示例代码,它真的会对我有所帮助这些对象并将它们存储在用户的设备上。

有什么建议吗?

更新:

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

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

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

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

有什么想法吗?



Best Answer-推荐答案


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

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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap