我正在使用swift 2和Xcode 7构建iOS应用程序,我想在MODEL和CONTROLLER之间进行分离。因此,我构建了一个自定义类,用于查询 Parse 中的数据并加载一个数组[在host
类中找到]。
问题是 - 在ViewController
类中找到的UITableView
在iPhone屏幕上加载为空,因为该数组应该填充ViewController
,直到比它为止。输出是:在tableview在屏幕上查看后,对象的数组加载,因此它是空表视图。
我需要知道如何让屏幕等待查看,直到PFObject
加载对象。
自定义类,用于从解析中查询数据。
UITableView
ViewController:
import Foundation
import Parse
import ParseTwitterUtils
class ParseQueryObject {
init(className:String) {
let query = PFQuery(className: "Tasks")
query.findObjectsInBackgroundWithBlock { (taskLista:[PFObject]?, error:NSError?) -> Void in
if error == nil {
taskList = taskLista as [PFObject]!
}
else {
print(error?.description)
}
}
}
}
}
答案 0 :(得分:0)
这是一个很好的开始。关键的想法是要意识到异步运行的函数经常需要告诉调用者他们已经完成了。您的视图控制器需要知道它可以重新加载tableView。就像解析的sdk一样,你的查询init
方法应该用回调声明......
func init(className:String, completion: (results:[PFObject]?, error:NSError?) -> Void) {
// your code as you have it, then, when inside the find...
query.findObjectsInBackgroundWithBlock { // ...
if error == nil {
taskList = taskLista as [PFObject]!
completion(results:taskLista, error:nil)
}
// ...
}
现在,您的视图控制器可以知道查询何时完成,因此何时更新UI ...
self.tableView.dataSource = self
ParseQueryObject.init(className: "Tasks" completion: { (taskLista:[PFObject]?, error:NSError?) -> Void in
self.tableView.reloadData()
})
答案 1 :(得分:0)
为了更好地澄清代码责任,init
应始终使用初始化代码而不是进行调用,并完成指示加载数据的完成。我认为这是初始化过程的结束。相反,您可以使用其他类似func loadData(completion: (results:[PFObject]?, error:NSError?) -> Void)
的方法。
除了不从reloadData()
拨打UITableView
外,无论你写了什么都没有问题。