经过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