我已经查看了Stack Overflow和其他Web资源,了解如何处理异步PARSE查询并将此数据存储到数组中。然后我使用此数组填充另一个视图控制器中的表。代码结构如下:
AppController.swift:
public var BuisnessNames = [NSString]()
[...]
public func updateFeedsMap(){
var query : PFQuery = PFUser.query()!
var objects : [AnyObject]?
var counter = 0
query.whereKey("isProprietor", equalTo: true)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
if error == nil {
// The find succeeded.
println("Successfully retrieved \(objects!.count) scores.")
// Do something with the found objects
if let objects = objects as? [PFObject] {
for object in objects {
dispatch_sync(dispatch_get_main_queue()) {
self.BuisnessNames.append(object ["BusinessName"] as! NSString)
}
}
}
} else {
// Log details of the failure
println("Error: \(error!) \(error!.userInfo!)")
}
}
}
}
RootVC.swift(继承自AppController):
override func viewDidLoad() {
if isUserLoggedIn() {
dispatch_async(dispatch_get_main_queue()){
self.updateFeedsMap()
}
}
RootVC在ViewDidAppear()中切换到第三个视图控制器,它使用BuisnessNames数组来填充tableview。但是,我目前没有获得任何数据到表。我花了很多时间在这上面,我没有想法,请帮忙!谢谢。
答案 0 :(得分:0)
您无需添加GCD代码。 findObjectsInBackground
让GCD为你工作,并在main上调用完成块,这就是你想要它的地方。
您可以删除调度(viewDidLoad
和查找完成块中的调度)。只需填充表的数据源数组,并将表告诉reloadData
。请记住以下其他表视图陷阱,例如忘记连接数据源和委托,或忘记在填充数组之前初始化数组。
答案 1 :(得分:0)
您错误是您在viewDidLoad
中请求数据,该过程是异步的。它将首先返回。
然后你在ViewDidAppear()
中触发一个segue,但此时你还没有从服务器收到任何数据。所以,你的tableview总是空的。
<强>解决方案:强>
收到数据时进行回调。然后用数据做任何你想做的事情
一个简单的callBack演示
public func updateFeedsMap(completion:()->()){
var query : PFQuery = PFUser.query()!
var objects : [AnyObject]?
var counter = 0
query.whereKey("isProprietor", equalTo: true)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
if error == nil {
// The find succeeded.
println("Successfully retrieved \(objects!.count) scores.")
// Do something with the found objects
if let objects = objects as? [PFObject] {
for object in objects {
dispatch_sync(dispatch_get_main_queue()) {
self.BuisnessNames.append(object ["BusinessName"] as! NSString)
}
}
//Here your data prase is done
dispatch_async(dispatch_get_main_queue(), { () -> Void in
completion()
})
}
} else {
// Log details of the failure
println("Error: \(error!) \(error!.userInfo!)")
}
}
}
}
然后,你调用这个函数
self.updateFeedsMap { () -> () in
//Here do something with data,reloadTableview or whatever you like
}