繁体   English   中英

为什么我的完成块不起作用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM