我使用解析查询当前用户的好友列表和好友请求用户,当用户按下好友请求的每个单元格时,应用程序会将该好友添加回去并删除所选好友请求,以便我查询好友列表和朋友请求和使用" 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循环
答案 0 :(得分:0)
findObjectsInBackgroundWithBlock
在... 背景中运行查询。
因此,您的计划执行以下操作:
特别是当程序到达第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
}