Alamofire 无法执行响应闭包



>Mac OS X 10.11.3 El-Capitan, XCode 7.2.1, Alamofire 3.5.1 via Carthage

试图获得我能想到的最基本的 Alamofire 示例。虽然我是一个经验丰富的开发人员,但我是XCode的新手,所以我确信我只是缺少一些基本的东西。我设置了一个新项目,通过迦太基添加了 Alamofire,在 main.swift 中添加了一个简单的获取请求。代码构建并运行,但我的响应闭包中的任何内容都不会被调用。我添加了睡眠,以确保等待足够长的时间才能调用关闭。我有小飞贼,看到我的项目正在召唤 httpbin.org。我已经尝试了各种响应*方法。但关闭永远不会运行,我错过了什么?

主.swift

import Alamofire
print("Start")
var x : String = "main"
Alamofire.request(.GET, "https://httpbin.org/get")
  .responseString {resp in
    print("in response handler")
    print("response (resp)")
    x = "response"
}
sleep(90)
print("End (x)")

控制台输出

Start
End main

XCode

Xcode 屏幕截图

我认为 Alamofire 默认调用主队列中的响应处理程序,因此如果您在主队列/线程中发出请求、睡眠和打印,则在应用程序终止之前不会从主队列执行 responseString。不知道 .responseString,但使用 .response,您可以指定队列:

public func response<T: ResponseSerializerType>(
        queue queue: dispatch_queue_t? = nil,
        responseSerializer: T,
        completionHandler: Response<T.SerializedObject, T.ErrorObject> -> Void)
        -> Self

不知道为什么,但是在另一个线程上运行完成块对我的命令行工具不起作用; 在等待回调之前,它仍然完成。我找到了一个非常好的选择http://mgrebenets.github.io/swift/2015/10/08/async-swift-scripting

此方法使用 RunLoop 使程序保持运行,直到回调触发。

摘要代码

var keepAlive = true
Alamofire.request("http://httpbin.org/get", parameters: ["foo": "bar"])
            .response(
    responseSerializer: DataRequest.jsonResponseSerializer()) { response in
        print(response.result.value ?? "")                
        keepAlive = false
    }
let runLoop = RunLoop.current
while keepAlive && runLoop.run(mode: RunLoopMode.defaultRunLoopMode, before: Date(timeIntervalSinceNow: 0.1)) {
    // Run, run, run
}
工作

示例的 Github 存储库

最新更新