菜鸟教程小白 发表于 2022-12-13 00:21:23

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


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

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

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

<p>我想实现自己的缓存系统。 </p>

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

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

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

<p>有什么建议吗?</p>

<p>更新:</p>

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

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

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

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

<p>有什么想法吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我还没有尝试过,但是如何设置查询的缓存策略,例如:</p>

<pre><code>query.cachePolicy = kPFCachePolicyCacheElseNetwork;
</code></pre>

<p>如果 saveEventually 使用的是常规解析缓存,那么它应该做你想做的事。</p>

<p><strong>编辑</strong> - 由于上述显然行不通,我可以想出几种方案来使用您自己的缓存,但它们都陷入了基本的竞争条件问题:假设您保存最终,然后再次查询。假设您已修复查询代码以获取最终保存的本地对象。 </p>

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

<p>如果您对此并不担心(也许第二个查询永远不会生成保存,或者您愿意在比赛条件下掷骰子),那么您有很多选择。让我们直截了当:</p>

<p>使用 NSCache 属性创建一个单例。给出在它的公共(public)接口(interface)中的这​​些方法...</p>

<pre><code>// call this instead of saveEventually
- (void)cacheThenSaveEventually:(NSArray *)pfObjects {
    for (PFObject *object in pfObjects) {
      ];
      [object saveEventually:^(BOOL success) {
            if (success) ];
      }];
   }
}

// call this with the result of a query that might have been in a race with saveEventually
- (NSArray *)freshenUpResults:(NSArray *)pfObjects {
    NSMutableArray *fresherObjects = ;
    for (PFObject *object in pfObjects) {
      PFObject *fresher = ];
      ;
    }
    return ;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Parse.com saveEventually 带有回调并使用 NSCache 来存储数据,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/25143199/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/25143199/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Parse.com saveEventually 带有回调并使用 NSCache 来存储数据