为啥我的完成块不起作用?
Posted
技术标签:
【中文标题】为啥我的完成块不起作用?【英文标题】:Why doesn't my completion block work?为什么我的完成块不起作用? 【发布时间】:2018-02-10 13:35:35 【问题描述】:实现这里给出的解决方案How to make a synchronous request using 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
,所以它正在移动到leaving viewDidLoad
不相关,但您必须在catch
子句中添加return
语句以避免调用完成闭包两次。输出的顺序是正确的,因为 loadData()
方法中的闭包稍后会异步返回其数据。
@vadian 不,我会补充的,谢谢。
@vadian 更好的是,移动 do
块内 do/catch 块之后的内容(至少是第二个 completion
调用)。
【参考方案1】:
第一个viewDidLoad
在主线程中运行。因此,当您将此 loadData()
放入 viewDidLoad
控件时,将调度到 alamofire 工作的后台线程,并且主线程继续并打印 leaving 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")
【讨论】:
谢谢。只是好奇,为什么最初的解决方案对其他人有效(在链接问题中),但对我无效? 其实它也适合你,但是你忘记在完成时重新加载表格【参考方案2】:从服务器获得响应后,您正在调用块代码。所以首先调用“print(”离开 viewDidLoad“)”。
响应代码延迟获取,因此延迟调用块代码
【讨论】:
以上是关于为啥我的完成块不起作用?的主要内容,如果未能解决你的问题,请参考以下文章