无法从Parse

时间:2015-12-21 23:42:49

标签: ios swift parse-platform

我希望做一些类似于大多数热门应用(例如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()
    }

1 个答案:

答案 0 :(得分:2)

您在循环外定义query,然后在循环内执行后台查询。您可以在每次循环迭代时修改现有查询,但是当您修改查询以进行下一次搜索时,第一个后台查询尚未完成,您将收到错误消息。

您可以在for循环内移动let query=PFUser.query(),但创建一组电话号码并在单个查询中使用containedIn条件然后循环返回结果会更有效。

此外,您不需要dispatch_async,因为您正在使用后台Parse调用,并且您不需要在主队列上调度重新加载。事实上,您过早地执行重新加载,因为您的查询无法完成。您需要从查询完成块重新加载。如果您只有一个查询,这将更容易。