【发布时间】:2015-09-08 20:57:39
【问题描述】:
我正在查询新闻提要的项目,并且通常查询会很好地触发(以毫秒为单位)并很好地填充我的新闻提要。其他时候,它会冻结应用程序并且不返回任何内容。
在模拟器中,当查询触发时,网络指示器将无休止地旋转并使用断点,我看到查询永远不会返回(使用findObjectsInBackground)。此时 Xcode 本身并没有显示任何网络活动,只是模拟器中的旋转网络指示器。最奇怪的是,大约 50% 的时间它完成得很好。我的代码如下:
PFQuery *query = [Item query];
[query includeKey:@"place"];
[query includeKey:@"place.createdBy"];
[query includeKey:@"owner"];
[query whereKeyDoesNotExist:@"userDeleted"];
[query orderByDescending:@"createdAt"];
[query setLimit:20];
// self.newsFeedItems = [query findObjects];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (objects) {
self.newsFeedItems = objects;
if (completionHandler) {completionHandler(nil);}
}
}];
Item 是 PFObject 的子类,我在我的应用程序的几个地方查询并保存这些没有问题。 place 是指向不同类的指针,place.createdBy 是位置对象上的用户对象。这似乎是一个非常简单的查询,只有 20 项。我使用同步调用来查看是否报告了任何其他信息,但是当它冻结时它只会锁定应用程序。
如果您发现我的查询有问题,我们将不胜感激。谢谢。这是一个带有完成处理程序的方法,因此是 completionHandler 行。
【问题讨论】:
-
查询是在客户端(iOS 应用)还是服务器端(解析)冻结?查看 Parse 浏览器并转到 Analytics 部分,然后转到慢查询。如果查询在适当的时间内成功执行,那么我们可以将问题缩小到应用程序内的某些问题或模拟器可能出现的奇怪行为
-
我看过 Parse Slow Queries,没什么帮助。只显示几行,它们的 0.0 百分比很慢,中位时间以毫秒为单位。现在在进一步调查中,我发现当我通过同步调用强制执行此查询时,应用程序将锁定 100%。该查询确实会触发并返回,但在调用其他查询时会立即锁定。不知何故,这会影响其他查询或对象。
-
如果您强制同步执行查询,您将阻塞同时处理 UI 的主线程,这将保证在查询完成之前锁定您的应用程序。听起来查询在后端正确执行,所以问题在于它的处理方式。您能否详细说明查询确实触发并返回但在调用其他查询时锁定的含义?是上面的代码还是其他地方的问题?确保您在任何时候都没有阻塞主线程
-
感谢您的建议。我在委托中进行同步查询只是为了测试目的......我知道应用程序会暂时锁定它。经过更多测试后,我看到了更多奇怪的事情。我将注释掉新闻提要查询,应用程序启动正常,但网络指示器无休止地显示(解析查询未正确完成?)。单击几个选项卡(选项卡栏应用程序)后,突然应用程序将完全冻结,Xcode 中没有错误消息。我需要做更多的挖掘并回来,因为可能会有更大的问题。最令人困惑的是,冻结只发生在 50% 的时间。
-
永远不要进行同步查询,尤其是在所有地方的应用委托中。删除所有同步查询,看看问题是否仍然存在。如果仍然存在问题,请尝试将查询注释掉,直到您可以将问题缩小到问题范围
标签: ios parse-platform