Ios swift:异步加载函数
经过10年的编码禁欲,我实际上是在尝试一个“回来”,通过在swift中开发一个小应用程序,使用解析作为后端。 到目前为止,它运行得相当顺利,但从几天以来,我就卡住了!我希望这里有人能帮助我 我在TableViewController中编写了两个方法,用于从解析后端和本地数据存储加载数据:Ios swift:异步加载函数,ios,swift,asynchronous,parse-platform,closures,Ios,Swift,Asynchronous,Parse Platform,Closures,经过10年的编码禁欲,我实际上是在尝试一个“回来”,通过在swift中开发一个小应用程序,使用解析作为后端。 到目前为止,它运行得相当顺利,但从几天以来,我就卡住了!我希望这里有人能帮助我 我在TableViewController中编写了两个方法,用于从解析后端和本地数据存储加载数据: //get data from local Datastore func fetchAllObjectsFromLocalDatastore() { let query: PFQuery = P
//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当我重新研究地形时,我总是阅读块和闭包。在我的理解中(不知道它是否正确),我必须编写异步callbak来实现这一点,对吗
我尝试了不同的东西,比如这里展示的,但没有真正起作用。
这里是我的最后一个方法:
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()
})
}
})
。。但它从不打印拉拉或更新表格视图我看不到您使用
完成
关闭。嗯,我不明白。你是什么意思?你在func fetchAllObjects(completion:(update:Bool?)->(){
上定义了一个completion
闭包,但从未使用过它我不太懂Swift,但是你在一个正在执行后台提取的函数中定义了let query:PFQuery
。当函数超出范围时,这个对象会发生什么?