GCD实现无法使用PARSE Query(Swift)

时间:2015-06-12 04:48:43

标签: ios swift asynchronous parse-platform grand-central-dispatch



我已经查看了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。但是,我目前没有获得任何数据到表。我花了很多时间在这上面,我没有想法,请帮忙!谢谢。

2 个答案:

答案 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
    }