该方法不进入循环Parse Swift

时间:2015-12-26 10:38:34

标签: swift parse-platform pfobject

我使用解析查询当前用户的好友列表和好友请求用户,当用户按下好友请求的每个单元格时,应用程序会将该好友添加回去并删除所选好友请求,以便我查询好友列表和朋友请求和使用" addedArray"如朋友要求和"重复"作为当前用户的朋友列表的数组并用于循环查找朋友列表和朋友请求的副本并从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()不为我循环运行而且我不明白为什么

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

2 个答案:

答案 0 :(得分:0)

  1. 运行for循环
  2. 重复数组,addedArray的值和大小 - 不,他们不
  3. findObjectsInBackgroundWithBlock在... 背景中运行查询。

    因此,您的计划执行以下操作:

    1. 启动第一个查询
    2. 开始第二次查询
    3. 运行for循环
      1. 查询在某个任意时间点完成。
    4. 特别是当程序到达第3点时,数组不包含任何内容,它们是空数组,因此for循环执行完全正常,因为它应该是:它什么都不做,因为没有任何东西可以循环。< / p>

      <强> 解决方案:

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

答案 1 :(得分:0)

您的问题是您的for循环取决于两个异步操作的结果。会发生什么是您的应用程序启动这两个后台查询,然后立即启动for循环。由于查询中还没有数据,因此for循环没有数据可供处理。

你可以通过嵌套你的操作(坏)来创建一个“金字塔地狱”来解决这个问题,或者你可以使用一个框架来实现与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
}