GCD 实现不适用于 PARSE 查询 (Swift)

GCD Implementation not working with PARSE Query (Swift)



我查看了 Stack Overflow 和其他网络资源,了解如何处理异步 PARSE 查询并将此数据存储到数组中。然后我使用这个数组在另一个视图控制器中填充 table 。代码结构如下:

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 数组填充 table 视图。但是,我目前没有通过 table 获取任何数据。我在这上面花了很多时间,但我没有想法,请帮忙!谢谢。

不需要您添加的 GCD 代码。 findObjectsInBackground 为您完成 GCD 工作,并调用 main 上的完成块,这就是您想要的位置。

您可以删除分派(在 viewDidLoad 和查找完成块中)。只需填充 table 的数据源数组并将 table 告诉 reloadData。请记住以下其他 table 视图陷阱,例如忘记连接数据源和委托,或者忘记在填充数组之前对其进行初始化。

您的错误是您在 viewDidLoad 中请求数据,该过程是异步的。它会先return。

然后你在ViewDidAppear()中触发了一个segue,但是此时你还没有收到来自server.So的任何数据,你的tableview一直是空的。

解法:

收到数据时回调。然后用数据做任何你想做的事

一个简单的回调演示

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
    }