为啥我的完成块不起作用?

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“)”。

响应代码延迟获取,因此延迟调用块代码

【讨论】:

以上是关于为啥我的完成块不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Flexbox Tailwind CSS 内联块不起作用

在百里香弹簧靴中,动态旋转木马滑块不起作用

引导滑块不起作用

JQuery Month 滑块不起作用

滑块不起作用并更新图表中的值

更改曲目 NAudio 后滑块不起作用