方法不进入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 循环
- for循环是运行
- 重复数组和添加的数组具有值和大小 - 不,它们没有
findObjectsInBackgroundWithBlock
运行s 查询在... 后台.
因此您的程序执行以下操作:
- 开始第一个查询
- 开始第二个查询
- 运行 for 循环
- 查询在任意时间点完成。
特别是当程序到达第 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
}
我使用解析查询当前用户的好友列表和好友请求用户,当用户按下好友请求的每个单元格时,该应用程序将添加回该好友并删除选定的好友请求,因此我查询好友列表和好友请求并使用 "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 循环
- for循环是运行
- 重复数组和添加的数组具有值和大小 - 不,它们没有
findObjectsInBackgroundWithBlock
运行s 查询在... 后台.
因此您的程序执行以下操作:
- 开始第一个查询
- 开始第二个查询
- 运行 for 循环
- 查询在任意时间点完成。
特别是当程序到达第 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
}