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

时间:2018-02-10 13:35:35

标签: ios swift asynchronous

实施此处提供的解决方案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

     

加载成功

显然,第一个元素应该是最后一个元素

2 个答案:

答案 0 :(得分:1)

第一个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")
}

答案 1 :(得分:-1)

从服务器获取响应后,您将调用阻止代码。所以先调用“print(”,留下viewDidLoad“)”。

响应代码延迟,因此调用具有延迟的块代码