解析存储本地数据存储对象以缓存和清除它们?

Parse storing local datastore objects to cache and clearing them?

我正在以标准方式将对象存储到 Parse 本地数据存储区:

[someObject pinInBackgroundWithName:someName];

一般来说,这工作正常。但是,有时当我进行本地查询时,即

PFQuery *query = [SomeObject query]; 
[query fromLocalDatastore];
[query fromPinWithName:someName];
[query findObjectsInBackgroundWithBlock:block];

似乎没有本地对象,我收到错误消息:

error   NSError *   domain: @"Parse" - code: 120

我理解为:

"Error code indicating the result was not found in the cache."

我以为本地数据存储和缓存是两种完全不同的存储机制?然而,我的数据似乎被保存到缓存中,然后被刷新。这怎么可能?如果本地数据存储被冲出我的控制范围,它就没有多大用处了...

更新

我最初以为是因为我在后台写入本地数据存储时正在访问它,因此得到了 nil 结果。但是将我固定到主线程上并不能解决这个问题。

然后我认为这可能是递归固定的错误,因为我的对象包含指向带有指针的对象的指针。但是明确固定所有指针并没有帮助——无论是在后台还是在主线程上。

我尝试在没有 includeKey 的情况下查询对象,我认为这意味着一致 returns,但是检索剩余数据所需的辅助查询对于我正在尝试做的事情来说有点慢。

最后,我觉得可能跟this bug

有关

写入任何新数据似乎会删除所有以前固定的数据...

请检查用于request/storing 对象的查询限制,因为默认的 limitSize = 100,并将其设置为最大值 1000(一次最多返回 1000 个结果)。

[query setLimit: 1000]; //the default is 100.

更新:我现在很确定 nil returns 是因为我包含了尚未获取的对象的键。因此,它不是返回一个附加了 nil 对象的对象数组,而是 returns nil。因此,如果您使用一堆包含键查询本地数据存储,请确保所有包含的数据首先存在于本地数据存储中。否则它 returns 无。

原回答:

我还没弄清楚,但有一个解决方法。我试图避免不得不使用它,但经过几天的摆弄,这似乎是唯一的解决方案。

不要在原始查询中包含任何“includeKey”。至少就我而言,这样做似乎会擦除本地数据存储。任何后续查询都可以正常工作,但如果您退出应用程序并重新打开它,或写入任何新数据,第一个查询总是会擦除存储和 returns nil 对象。

因此,查询单个对象,然后在需要访问它指向的任何内容时获取 FromLocalDatastore。

我找到了建议 here and here(感谢@PowHu),但我在网上几乎找不到关于此问题的其他信息。

您尝试固定包含指向其他对象的指针的对象。 这是一个 parse.com 本地数据存储错误!这是一个解决方法:

Try to first pin the inner object and only after that pin the wrapper object.