Ios GCD串行队列未按顺序返回

Ios GCD串行队列未按顺序返回,ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,我不明白为什么第二个函数在第一个函数之前返回。这是我的密码。我想我错过了一些简单的事情 let queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL) dispatch_async(queue) { self.requestToServer() self.sayHello() dispatch_async(get_main_queue(), { // Update the UI... } }

我不明白为什么第二个函数在第一个函数之前返回。这是我的密码。我想我错过了一些简单的事情

let queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL)

dispatch_async(queue) {
  self.requestToServer()
  self.sayHello()
    dispatch_async(get_main_queue(), {
        // Update the UI... 
    }
}

requestToServer()
函数显然比
sayHello()
函数花费的时间更长,但它们不应该使用我创建的串行队列一次执行一个吗?我做错了什么

您误解了串行队列的概念。串行队列保证块将按照添加顺序执行。它不控制同一块中的语句。块可以在其所有语句完成之前结束

如果我把你的街区描述为铁路支线,它看起来是这样的:

     (another queue)  -- requestToServer() ---------------------------
                     /                                  
(serial queue) start ------- sayHello() ----
                                            \
                                (main queue) --- Update the UI
requestToServer()
在更新GUI之前没有机会完成

相反,请重写您的
requestToServer()
以获取完成处理程序:

func requestToServer{completion: () -> Void) {
    let session = NSURLSession(configuration: ...)
    let task = session.dataTaskWithURL(url) { data, response, error in
        // check the response from server
        ...

        // when everything is OK, call the completion handler
        completion()
    }
    task.resume()
}

self.requestToServer() {
    self.sayHello()
    dispatch_async(get_main_queue()) {
        // Update the UI... 
    }
}

您误解了串行队列的概念。串行队列保证块将按照添加顺序执行。它不控制同一块中的语句。块可以在其所有语句完成之前结束

如果我把你的街区描述为铁路支线,它看起来是这样的:

     (another queue)  -- requestToServer() ---------------------------
                     /                                  
(serial queue) start ------- sayHello() ----
                                            \
                                (main queue) --- Update the UI
requestToServer()
在更新GUI之前没有机会完成

相反,请重写您的
requestToServer()
以获取完成处理程序:

func requestToServer{completion: () -> Void) {
    let session = NSURLSession(configuration: ...)
    let task = session.dataTaskWithURL(url) { data, response, error in
        // check the response from server
        ...

        // when everything is OK, call the completion handler
        completion()
    }
    task.resume()
}

self.requestToServer() {
    self.sayHello()
    dispatch_async(get_main_queue()) {
        // Update the UI... 
    }
}

requestToServer()
是否异步运行?它是一个NSURLSession,所以是的,我几乎可以肯定它是异步的。
requestToServer()
是否异步运行?它是一个NSURLSession,所以是的,我几乎可以肯定它是异步的。所以,理论上,只要我有一个完成处理程序,我就可以使用常规并发队列?完成处理程序是在队列完成后要执行的操作。在您的情况下,您希望
sayHello()
并在
requestToServer()
完成后更新UI
requestToServer()
已在其自己的队列上运行。只需添加一个完成处理程序,让它知道当队列结束我讨厌成为一个麻烦时该怎么做,但我不确定如何编写这个完成处理程序来提醒我该函数何时完成。我知道这是答案,所以我会将其标记为这样。我只需要了解如何编写完成处理程序。我知道一开始很难掌握,但如果你编写大量并发代码,你会很快习惯完成处理程序的概念。理论上,只要我有一个完成处理程序,我就可以使用常规并发队列?完成处理程序是在队列完成后要执行的操作。在您的情况下,您希望
sayHello()
并在
requestToServer()
完成后更新UI
requestToServer()
已在其自己的队列上运行。只需添加一个完成处理程序,让它知道当队列结束我讨厌成为一个麻烦时该怎么做,但我不确定如何编写这个完成处理程序来提醒我该函数何时完成。我知道这是答案,所以我会将其标记为这样。我只需要了解如何编写完成处理程序。我知道一开始很难掌握,但如果你编写大量并发代码,你会很快习惯完成处理程序的概念