Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么我的学业成绩不及格?_Ios_Swift_Asynchronous - Fatal编程技术网

Ios 为什么我的学业成绩不及格?

Ios 为什么我的学业成绩不及格?,ios,swift,asynchronous,Ios,Swift,Asynchronous,实现这里给出的解决方案 我没有收到任何错误,只是没有按预期工作。在tableViewController中 override func viewDidLoad() { super.viewDidLoad() loadData() { (didCompleteRequest) in if (didCompleteRequest) { self.TodosTableView.delegate = self self.T

实现这里给出的解决方案

我没有收到任何错误,只是没有按预期工作。在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")
}

从服务器获得响应后,您将调用块代码。所以首先调用printViewDidLoad


响应代码get with delay所以调用block code with delay

这是一个异步请求,因此它不会等待完成loadData,因此它将移动到保持viewDidLoadUnrelated,但您必须在catch子句中添加一个return语句,以避免调用两次完成闭包。输出的顺序是正确的,因为loadData方法中的闭包稍后会异步返回其数据。@vadian不,我将添加,谢谢。@vadian更好的是,至少将do/catch块之后的第二次完成调用移到do块中。谢谢。只是好奇,为什么最初的解决方案对链接问题中的其他人有效,但对我无效?实际上它对您也有效,但您忘记了在完成时重新加载表