[英]Why doesn't my completion block work?
实现这里给出的解决方案如何使用 Alamofire 发出同步请求?
我没有收到任何错误,只是没有按预期工作。 在 tableViewController 中
override func viewDidLoad() {
super.viewDidLoad()
loadData() { (didCompleteRequest) in
if (didCompleteRequest) {
self.TodosTableView.delegate = self
self.TodosTableView.dataSource = self
print("loading successfull")
} else {
print("loading failed")
}
}
print("leaving viewDidLoad")
}
func loadData(completion: @escaping (Bool) -> Void) {
Alamofire.request(TodosViewController.serverAdress + "projects/index.json").responseJSON { response in
do {
// async stuff
} catch {
completion(false)
}
print("leaving loadData")
completion(true)
}
}
我得到的输出
离开 viewDidLoad
离开 loadData
加载成功
显然,第一个元素应该是最后一个
首先viewDidLoad
在主线程中运行。 因此,当您将此loadData()
放在viewDidLoad
控件中时,控件会分派到 alamofire 工作的后台线程,并且主线程继续并打印离开 viewDidLoad
尝试这个
override func viewDidLoad() {
super.viewDidLoad()
self.TodosTableView.delegate = self
self.TodosTableView.dataSource = self
loadData() { (didCompleteRequest) in
if (didCompleteRequest) {
self.TodosTableView.reloadData()
print("loading successfull")
} else {
print("loading failed")
}
}
print("leaving viewDidLoad")
}
从服务器获得响应后,您正在调用块代码。 所以首先调用“打印(“离开viewDidLoad”)”。
响应代码延迟获取所以调用块代码延迟
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.