GCD串行队列无法按顺序返回

时间:2016-03-02 01:19:04

标签: 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... 
    }
}

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

1 个答案:

答案 0 :(得分:2)

你误解了串行队列的想法。串行队列可确保按添加顺序执行块。它不控制同一块中的语句。该块可以在其所有语句完成之前结束。

如果我将您的区块描述为铁路分支,它看起来像这样:

     (another queue)  -- requestToServer() ---------------------------
                     /                                  
(serial queue) start ------- sayHello() ----
                                            \
                                (main queue) --- Update the UI
在更新GUI之前,

requestToServer()没有机会完成。

相反,重写您的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... 
    }
}