如何确保Alamofire请求运行?

时间:2017-02-16 13:23:02

标签: swift asynchronous concurrency alamofire

我将Alamofire readmefa3c6d0)的第一个示例复制粘贴到main.swift

import Foundation
import Alamofire

Alamofire.request("https://httpbin.org/get").responseJSON { response in
    print(response.request)  // original URL request
    print(response.response) // HTTP URL response
    print(response.data)     // server data
    print(response.result)   // result of response serialization

    if let JSON = response.result.value {
     print("JSON: \(JSON)")
    }
}

print("Done")

当我运行它时,我得到的只是Done,然后应用程序终止。

虽然我看到here我可以选择一个调度队列,this answer似乎暗示我不应该这样做。

无论如何,有了similar issue的“基本”请求,我尝试了同样的solution但无济于事:应用程序现在阻止了。所以,显然,Alamofire的默认值与URLSession不同,并且想要使用主线程。

在像这样的应用程序中执行(和等待)请求的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我们需要做两件事。

  1. 在后台执行请求。
  2. 阻止主线程,直到请求完成,即运行完成处理程序。
  3. 我的原始代码都没有。

    第一项是使用.response(queue: DispatchQueue(label: "some-name"))(或其中一种变体)实现的。

    等待可以通过多种方式完成。

    1. 使用标记和活动等待,如here所示(不会扩展到多个请求)。
    2. 使用主动等待与倒计时锁定,如here所示(适用于多个请求)。
    3. 使用DispatchSemaphore,例如here
    4. 可能还有更多。