方法不进入for循环Parse Swift

The method does not enter for loop Parse Swift

我使用解析查询当前用户的好友列表和好友请求用户,当用户按下好友请求的每个单元格时,该应用程序将添加回该好友并删除选定的好友请求,因此我查询好友列表和好友请求并使用 "addedArray" 作为好友请求,使用 "duplicate" 作为当前用户好友列表的数组,并使用 for 循环查找好友列表和好友请求的副本,并从 addedArray 中删除该好友,以便当前用户将使用最近的好友请求

这是我在 swift

中的代码
   func queryAdded(){
    let query = PFQuery(className: "Request")
    let user = PFUser.currentUser()?.relationForKey("Friends")
    let query2 = user?.query()

    query.whereKey("To", equalTo: PFUser.currentUser()!)
    query.findObjectsInBackgroundWithBlock {
        (objects, error) -> Void in
        if error == nil{
        for object in objects! {
            print("query")
            let username = object.valueForKey("FromUsername") as! String
            self.userCellAdded = username
                self.addedArray.append(username)
                print(username)
               print(self.addedArray.count)

            }
            print("READY")
            print(self.addedArray.count)
            self.tableView.reloadData()
        }
        else{
           /* dispatch_async(dispatch_get_main_queue()){
                //reload the table view
                query.cachePolicy = PFCachePolicy.NetworkElseCache
            }*/

            print("errorrrr")
        }
    }

    query2!.findObjectsInBackgroundWithBlock{(objects,error) -> Void in
        if error == nil {
            for object in (objects)!{
                if let username = object["username"] as? String {
                    self.duplicate.append(username)
                    print("duplicate")
                    print(username)
                    print("size")
                    print(self.duplicate.count)
                }
            }
        }
    }

    for self.iIndex = 0 ; self.iIndex < self.addedArray.count ; ++self.iIndex {
        for self.jIndex = 0 ; self.jIndex < self.duplicate.count ; ++self.jIndex {
            print("in for loop")
            if self.addedArray[self.iIndex] == self.duplicate[self.jIndex] {
                self.addedArray.removeAtIndex(self.iIndex)
                self.tableView.reloadData()
                print("find")
            }
        }
    }
}

问题是 queryAdded() 方法对我来说没有 运行 for 循环,我不明白为什么

重复数组和 addedArray 具有值和大小,但它仍然没有进入 for 循环

  1. for循环是运行
  2. 重复数组和添加的数组具有值和大小 - 不,它们没有

findObjectsInBackgroundWithBlock 运行s 查询在... 后台.

因此您的程序执行以下操作:

  1. 开始第一个查询
  2. 开始第二个查询
  3. 运行 for 循环
    1. 查询在任意时间点完成。

特别是当程序到达第 3 点时,数组不包含任何内容,它们是空数组,因此 for 循环执行得非常好,因为它应该是:它什么都不做,因为没有什么可以循环.

解法:

将 for 循环移动到您在第一个查询和第二个查询完成后调用的函数中。

你的问题是你的for循环依赖于两个异步操作的结果。发生的情况是您的应用程序启动了这两个后台查询,然后立即启动了 for 循环。由于查询中还没有数据,因此 for 循环没有可处理的数据。

您可以通过嵌套操作创建 "pyramid hell" 来解决此问题(不好),或者您可以使用框架来实现与 Promises 为 JavaScript 提供的功能相同的功能(好)。

既然你用的是Parse,那么你已经有了这样的框架;即Bolts Framework。然后,您可以使用任务 (BFTask) 按顺序执行这些操作。

Bolts 自述文件中的示例:

var query = PFQuery(className:"Student")
query.orderByDescending("gpa")
findAsync(query).continueWithSuccessBlock {
  (task: BFTask!) -> BFTask in
  let students = task.result() as NSArray
  var valedictorian = students.objectAtIndex(0) as PFObject
  valedictorian["valedictorian"] = true
  return self.saveAsync(valedictorian)
}.continueWithSuccessBlock {
  (task: BFTask!) -> BFTask in
  var valedictorian = task.result() as PFObject
  return self.findAsync(query)
}.continueWithSuccessBlock {
  (task: BFTask!) -> BFTask in
  let students = task.result() as NSArray
  var salutatorian = students.objectAtIndex(1) as PFObject
  salutatorian["salutatorian"] = true
  return self.saveAsync(salutatorian)
}.continueWithSuccessBlock {
  (task: BFTask!) -> AnyObject! in
  // Everything is done!
  return nil
}

然后您可以先准备两个查询,然后开始任务链:

query1.findObjectsInBackground().continueWithSuccessBlock {
    (task: BFTask!) -> BFTask in
    var objects = task.result() as NSArray
    for object in objects {
        //collect your usernames
    }
    return query2.findObjectsInBackground()
}.continueWithSuccessBlock {
    (task: BFTask!) -> AnyObject! in
    var objects = task.result() as NSArray
    for object in objects {
        // collect your usernames from relation
    }
    // Call a function containing the for loop that is currently not running
    return nil
}