我希望做一些类似于大多数热门应用(例如Snapchat)的用户验证电话号码,然后将应用授予其联系人的权限,以便可以显示已注册的朋友。
我想要两个表视图部分。一个部分用于不在应用程序上的联系人,另一部分用于联系人的电话号码与Parse列中的一个匹配,“phoneNumber”。第二部分导致此错误,告诉我我一次运行多个查询。
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'此查询具有出色的网络连接。你必须等到它完成。'
以下是我正在尝试运行的代码:
let query = PFUser.query()
for person in self.people! { // iterate through phone contacts
let numbers = person.phoneNumbers
let primaryNumber = numbers?.map({$0.value})[0] // pull contact's first phone number (i.e. main number)
dispatch_async(dispatch_get_main_queue()) {
query?.whereKey("phoneNumber", equalTo: primaryNumber!)
query?.getFirstObjectInBackgroundWithBlock({ (object, error) -> Void in
self.contactsOnTheApp.addObject(object!) // create array of users already on the app to then show in table view section
})
}
}
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
答案 0 :(得分:2)
您在循环外定义query
,然后在循环内执行后台查询。您可以在每次循环迭代时修改现有查询,但是当您修改查询以进行下一次搜索时,第一个后台查询尚未完成,您将收到错误消息。
您可以在for循环内移动let query=PFUser.query()
,但创建一组电话号码并在单个查询中使用containedIn
条件然后循环返回结果会更有效。
此外,您不需要dispatch_async
,因为您正在使用后台Parse调用,并且您不需要在主队列上调度重新加载。事实上,您过早地执行重新加载,因为您的查询无法完成。您需要从查询完成块重新加载。如果您只有一个查询,这将更容易。