swift:异步加载功能

时间:2015-10-16 13:56:36

标签: ios swift asynchronous parse-platform closures

经过10年的禁欲编码,我实际上是通过使用解析作为后端在swift中开发一个小应用来尝试“回来”。 到目前为止,它运行得相当顺利,但几天后,我卡住了!我希望这里有人可以帮助我。

我在TableViewController中编写了两个方法,用于从解析后端和本地数据存储区加载数据:

    //get data from local Datastore
func fetchAllObjectsFromLocalDatastore() {
    let query: PFQuery = PFQuery(className: "Task")

    query.fromLocalDatastore()

    query.whereKey("delete", equalTo: false)


    query.findObjectsInBackground().continueWithBlock {
        (task: BFTask!) -> AnyObject in
        if let error = task.error {
            print("Error: \(error)")
            return task
        }
        //LOG
        print("Retrieved \(task.result.count)")

        let objects = task.result as? NSArray
        self.taskObjects = objects?.mutableCopy() as! NSMutableArray
        dispatch_async(dispatch_get_main_queue(), {
            self.tableView.reloadData()
        })
        return task
    }
}

//get data from parse and cach it locally
func fetchAllObjects() {

    let query: PFQuery = PFQuery(className: "Task")

    print(PFUser.currentUser()?.username) //log
    query.whereKey("done", equalTo: false)
    // Query for new results from the network
    query.findObjectsInBackground().continueWithSuccessBlock({
        (task: BFTask!) -> AnyObject! in
        print("Retrieved \(task.result.count)")

        return PFObject.unpinAllObjectsInBackground().continueWithSuccessBlock({
            (ignored: BFTask!) -> AnyObject! in
            // Cache new results in local data store
            let objects = task.result as? NSArray
            let temp : BFTask = PFObject.pinAllInBackground(objects as? [AnyObject], withName: "Task")
            self.fetchAllObjectsFromLocalDatastore()
            return temp
        })
    })

}

这两种方法运行良好,但现在我想将应用程序改进到更像MVC架构并添加一些新功能。因此,我试图将它们放入一个单独的类中。现在我的问题出现了:当我最后一次在C中开发时,线程得到了非常普遍,所以这也是我第一次做异步任务的意图。 Nur,当我研究Topos时,我总是最终阅读了块和闭包。根据我的理解(不知道是否正确),我必须编写异步调用函数,我可以这样做 - 对吗?

我尝试了不同的东西,如Swift: Asynchronous callback所示,但没有任何效果。 这是我的最后一种方法:

func fetchAllObjects(completion: (update:Bool?)->()) {
    print("CallParse")
    var update = false
    let query: PFQuery = PFQuery(className: "Task")

    print(PFUser.currentUser()?.username) //log
    query.whereKey("done", equalTo: false)
    // Query for new results from the network

    query.findObjectsInBackground().continueWithSuccessBlock({
    (task: BFTask!) -> AnyObject! in
        print("Retrieved \(task.result.count)")

        return PFObject.unpinAllObjectsInBackground().continueWithSuccessBlock({
        (ignored: BFTask!) -> AnyObject! in
            // Cache new results
            let objects = task.result as? NSArray
            let temp : BFTask = PFObject.pinAllInBackground(objects as? [AnyObject], withName: "Task")
            //self.fetchAllObjectsFromLocalDatastore()
            update = true
            return temp
        })
    //TODO: correct update
    })
}

和电话:

 tasklist.fetchAllObjects({(update) -> () in
                print("lalalalal")
                if (update==true) {
                    dispatch_async(dispatch_get_main_queue(), {
                       self.tableView.reloadData()
                    })
                }
            })

..但它从不打印lalala或更新tableView

0 个答案:

没有答案