我有一个应用程序,它使用 parse 将数据存储在 parse 的本地数据存储中,并将所述数据备份到解析云。一般来说,这种方法效果很好。在本地和云端存储数据的关键代码如下:
- (void)store:(PFObject*) parseObject {
if (parseObject) {
[parseObject pinInBackground];
[parseObject saveEventually];
} else
NSLog(@"Err :Store was passed a nil?");
}
Run Code Online (Sandbox Code Playgroud)
我有一个应用程序,一些用户表示,如果他们设置数据然后“不久”终止该应用程序,则会丢失数据。
当用户数据更新时,该函数会快速连续传递大约 10 个或更多项目来存储。
我通过执行以下操作测试了这种情况。我让所有项目都被存储,并设置一个断点,以便在完成后命中。然后,我让应用程序再次运行,并通过按主页键并滑开应用程序来终止它。它还有大约一秒左右的运行时间,但关键点是无论如何,每个对象的存储都已完成。
我确实发现数据可能会丢失。看来,仅仅因为这些方法已运行并不能保证数据将被存储。需要明确的是,我知道这些函数不存储数据,但我曾认为(假设)在完成后可以保证存储数据的意图。
我想添加以下内容:
我的问题如下:
我预计一旦这些电话返回,任务就会被锁定并且始终会完成。我知道无法保证 saveeventually 可能需要多长时间,但即使在下次运行应用程序时,它也始终会“最终”完成。我做错了什么吗?我是否面临这种数据丢失的风险并需要采取进一步的预防措施?有人有什么经验或建议吗?即使只是您发现它对您有用?可能我在其他地方做了一些愚蠢的事情,但很难看出是怎么做的。
谢谢你的时间。
我使用解析作为云存储,结合本地数据存储进行一般访问.我发现查询本地数据存储需要的时间比我预期的要长很多.使用数据填充表或更新图形视图时,这一点尤其明显.coredata中的等效函数几乎是瞬时的,结果非常好.虽然我不期望coredata的性能,但它比我预期的离线访问慢得多,我想知道我做错了什么?
这是一个示例查询:
PFQuery *query = [PFQuery queryWithClassName:LOCATION_OBJECT];
[query fromLocalDatastore];
[query whereKey:MESSAGE_TO_FIELD equalTo:user.username];
[query orderByDescending:CREATED_FIELD];
NSLog(@"Query started");
NSArray* res = [query findObjects];
NSLog(@"Query finished, found %lu objects", (unsigned long)[res count]);
Run Code Online (Sandbox Code Playgroud)
在2015 iPad mini上执行我看到的时间如下:
2015-06-16 18:56:38.883 app[1744:1668474] Query started
2015-06-16 18:56:38.885 app[1744:1668474] Warning: A long-running operation is being executed on the main thread.
Break on warnBlockingOperationOnMainThread() to debug.
2015-06-16 18:56:39.177 app[1744:1668474] Query finished, found 17 objects
Run Code Online (Sandbox Code Playgroud)
我确实理解Parse提供的不仅仅是一个数据库,不过这个查询需要0.292秒,这似乎是一个时代.对于我的应用程序,当用户在屏幕上导航时,我会经常使用这种操作.使用coredata,结果非常好,Parse的延迟非常明显.值得一提的是,模拟器上的结果相似.当你做这类事情时警告解析问题并不令人鼓舞,但无论如何,我的问题有两个:
1)我是否错过了Parse中的任何性能调整/设置?2)是否有其他使用过Parse的人发现了类似的表现或有任何建议?
在这一点上,看起来我需要在应用程序中使用coredata并编写我自己的例程来将数据推送到Parse的云,这比我希望的要多得多.
谢谢你的时间.
更新30Jun15
感谢您的评论,根据这些评论,以下是Parse希望您这样做的示例表现.和以前一样,与coredata相比,性能仍然很差.示例代码:
PFQuery *query = [PFQuery queryWithClassName:LOCATION_OBJECT];
[query fromLocalDatastore];
[query whereKey:MESSAGE_TO_FIELD equalTo:user.username]; …Run Code Online (Sandbox Code Playgroud)