2017-03-06 51 views
0

我的问题如下:我有一个参数类,其中所有参数都有一个parentId,它确实是其他参数的objectId。我想写一个查询,在这里我可以得到所有这些父子关系相互连接的参数列表。所以,我有试过这种..为什么变量在循环内部的分析查询中使用时没有改变它的值

class ArgumentViewController: UIViewController { 

var all = [String]() 
var temporaryId = "vEKV1xCO09" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    for _ in 1...3 { 
     let query = PFQuery(className: "Argument").whereKey("objectId", equalTo: temporaryId) 

     query.findObjectsInBackground { (objects, error) in 
      if let arguments = objects { 
       for argument in arguments { 
        self.all.append(argument["parentId"] as! String) 
        print(self.all) 
        self.temporaryId = argument["parentId"] as! String 
       } 
      } 
     } 
    } 

}

但问题temporaryId循环内不更新自身。它在所有迭代中都保持不变。因此,当我打印(self.all)我只是得到一个数组的3个字符串,都是我的初始参数的父亲

我的目标是获得一个数组,它是[我的初始参数的父项,我最初的论点,我父母的父母亲...]

我已经搜索了类似的主题,但找不到解决方案。任何帮助将非常感激。

+0

所以你的问题是self.temporaryId = argument [“parentId”] as!字符串不会从“vEKV1xCO09”更改为其他内容是正确的吗? –

+0

这是完全正确的 –

+1

我想出了为什么但仍然找不到解决方案的原因。显然,由于“findObjectsInBackground”是一个异步查询,因此主线程在查询达到结论之前运行。我尝试使用“findObjects”而不是“findObjectsInBackground”,它给了我正在寻找的数组,但显着减慢了UI,给我一个“主线程正在执行长时间运行的操作”的警告。 –

回答

0

由于在后台线程query.findObjectsInBackground运行,没有办法更新temporaryId在每一个for环新检索@"parentId"

所以我想你可以创建一个递归函数,是这样的:

func getParentId() { 
    let query = PFQuery(className: "Argument").whereKey("objectId", equalTo: temporaryId) 

    query.findObjectsInBackground { (objects, error) in 
     if let arguments = objects { 
      for argument in arguments { 
       self.all.append(argument["parentId"] as! String) 
       print(self.all) 
       self.temporaryId = argument["parentId"] as! String 
       while (all.count <= 3) { 
        getParentId() 
       } 
      } 
     } 
    } 
} 

我没有做过斯威夫特足够的练习,因为我一个Objective-C开发人员,所以我很抱歉,如果我犯了一些语法错误。

+0

这解决了我的问题。非常感谢你的帮助.. –

相关问题