- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Parse.com 有一个 saveEventually
选项,可将数据存储到磁盘并等待网络连接继续并将其保存到服务器。
但是,有时当网络连接可用并且用户快速切换屏幕时,新数据尚未保存到服务器,导致 View 显示旧数据。
对于 parse.com 用户,当我运行新的 query
并且 saveEventually
调用尚未完成时,会发生这种情况。
我想实现自己的缓存系统。
我想在完成时调用带有回调的saveEventually
,然后我会删除缓存的数据。
这样,我可以在建立网络连接之前先检查是否有缓存数据。
我想我可以使用 NSCache
和 NSDiscardableContent
来完成,我已经阅读了文档,但是如果我能看到一些简单的示例代码来创建这些对象并将它们存储在用户的设备上。
有什么建议吗?
更新:
好的,这是一个变通解决方案的想法。
我调用 saveEventually
的每个对象都将添加到 NSArray
并将其存储在 documentsDirectory
中,然后,在 saveEventually
完成 我将删除 documentsDirectory
中的 array
。
如果应用程序在完成之前关闭,我不会得到回调
,但这不会成为问题,因为我将在服务器上执行查询并获取存储的NSArray
在设备中,然后我会创建一个唯一的数组,优先考虑 documentsDirectory
中的对象。
我认为这可行。我担心的是它是否会使我的应用程序变慢。
有什么想法吗?
最佳答案
我没试过这个,但是如何设置查询的缓存策略,比如:
query.cachePolicy = kPFCachePolicyCacheElseNetwork;
如果 saveEventually 使用的是常规解析缓存,那么它应该会按照您的意愿执行。
编辑 - 由于上面的方法显然行不通,我可以想到几种方案来使用你自己的缓存,但它们都被基本的竞争条件问题所困:说你保存最终,再查询。假设您已修复查询代码以获取最终保存的本地对象。
如果您修改缓存对象并最终(再次)保存它会怎样?我们知道 parse 会正确序列化这两个保存吗?
如果您不担心这一点(也许第二个查询永远不会生成保存,或者您愿意在竞争条件下掷骰子),那么您有很多选择。让我们采取直截了当的方式:
创建一个带有 NSCache 属性的单例。提供这些位于其公共(public)接口(interface)中的方法...
// 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];
}
关于ios - Parse.com saveEventually with callback 并使用 NSCache 存储数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25143199/
我尽可能在我的 Parse 支持的应用程序中使用 saveEventually,以便在连接出现问题时我的应用程序仍能按预期运行。 我在文档中看到它说您可以多次对单个对象调用 saveEventuall
当我尝试在没有网络连接的情况下保存 PFObject 时,它已成功保存在本地,每当我再次通过网络连接启动应用程序时,似乎该对象将被保存到服务器,但所有参数为空。 我正在执行以下过程,首先我创建一个具有
我在下面的代码部分使用了 saveEventually。问题是,当应用程序最小化并重新打开时,saveEventually 不起作用,仅当应用程序完全关闭并重新打开时。有什么办法可以解决这个问题吗?
是否有理由使用 saveInBackground 而不是 saveEventually?两者都有可用的回调。在性能或功能上有什么不同吗?它们是否具有完全相同的功能,但使用 saveEventually
我正在为我的 Android 应用程序使用 Parse Server,并且一切正常,但每次我在新的或旧的 ParseObject 上调用 saveEventually 时,它都需要真的很久了。有时1个
我最终遇到了保存问题。 我正在从解析中检索一个对象,该对象包含用户的指针。 我正在尝试更新对象并使用其他用户保存它。 object.incrementKey("Likes") object.addOb
我最近开始为 Android 应用程序使用 Parse 库。我想使用 saveEventually 存储用户联系人,然后使用 ParseRelation 将其与用户相关联。由于有多个联系人映射到用户,
我正在使用 PFUser 和 PFInstallation 以及 saveEventually 方法。但是,当我调用该方法时,我收到一条错误消息: Missing argument for param
Parse.com 有一个 saveEventually 选项,可将数据存储到磁盘并等待网络连接继续并将其保存到服务器。 但是,有时当网络连接可用并且用户快速切换屏幕时,新数据尚未保存到服务器,导致
以下简单示例创建三个 PFObject,并为每个对象调用一次 saveEventually。第一个对象是父对象,另外两个是子对象。 children 指向 parent 。 PFObject *a =
查看 Parse 文档,有一个 saveEventually() 方法可用于代替 save() 和 saveInBackground()。 我可以在我的代码中的任何地方使用这个函数来代替 save 和
我是一名优秀的程序员,十分优秀!