关于使用Alamofire版本的管理器

8
我使用这段代码。
var apiPath : String = "/api/list/"
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForRequest = 60
let manager = Alamofire.Manager(configuration: configuration)
manager.session.configuration.HTTPAdditionalHeaders = ["_token" : self._token]
manager.request(.GET, self._host + self._url + apiPath, parameters: nil)
    .responseSwiftyJSON ({ (request, response, resultJson, error) in
        if (resultJson["Success"]) {
             //get list success
        } else {
            println("request : \(request)")
            println("response : \(response)")
            println("resultJson : \(resultJson)")
            println("error : \(error)")
        }

})

我遇到了一些问题

使用Alamofire版本1.2.1:没有问题

使用Alamofire版本1.2.2和1.2.3:

request : { URL: https://test.com/api/list/ }

response : nil

resultJson : null

错误:可选项(错误域=NSURLErrorDomain Code=-999“取消” UserInfo=0x7feb92c434f0 {NSErrorFailingURLKey=https ://test.com/api/list/,NSLocalizedDescription=取消, NSErrorFailingURLStringKey=http s://test.com/api/list/)

为什么在版本1.2.2和1.2.3中响应为空,结果JSON为空,请帮助我找出这段代码的问题。


1
Alamofire.request(... 没有问题,为什么? - isaced
因为我想设置请求超时时间,就像这样:'configuration.timeoutIntervalForRequest = 60'。 - Torres Fernando
是的,我想设置头字段,所以遇到了同样的问题。 - isaced
由于身份验证挑战失败,请求被取消。 - mattt
2个回答

16

我今天更新 Alamofire 从1.2.1到1.2.3后遇到了和你一样的问题。

我发现在responseJSON块最后和内部添加 "manager.session.invalidateAndCancel()" 可以解决这个问题。但是我不明白为什么 responseJSON 块内的这行代码会影响 responseJSON 的结果。

总之,在Alamofire团队修复它或有人向我解释原因之前,我将继续使用这个修复方法。


你能看一下我的代码吗?我还是无法解决它... http://stackoverflow.com/questions/31289074/authenticated-http-request-swift-alamofire?noredirect=1 - CularBytes
3
这是因为这行代码会确保在内部代码块执行完之前,经理对象不会被释放。基本上,您通过创建一个保留循环来“修复”问题。真正的问题是,在达到带有该行代码的响应块之前,经理对象已被释放。您需要确保保持对经理对象的引用。 - Kevin R
@KevinR - 你应该如何确保保留对经理的引用? - raklos
1
@raklos,你可以使用默认管理器(如果使用4.0或更高版本,则使用sharedManager),或者如果你定义自己的配置,请确保在某个地方保留静态引用。这样实例就可以全局访问,并且不会创建可能的保留循环。 - Kevin R

1

我注意到你的API端点表明需要安全连接:

httpS://test.com/api/list/

为了防万一,试一下,也许它会重复你的情况。

在我的案例中,这是API管理器代码中的一个笔误。可以说是与应用程序传输安全设置相关的部分。

只需将受保护的协议从httpS://更改为http://,错误:

NSURLErrorDomain Code = -999 "cancelled"

就消失了,而且一切都正常工作了

+如果您遇到类似的问题,还要确保与后端专家讨论此问题,他们负责为您的应用程序配置服务器或API。这意味着服务器没有有效的安全证书。也许您仍然需要建立安全连接。或者这位专家可以再次将所有内容从http://配置回httpS://,我不确定(没有检查),当您在代码中已经使用非安全的http://连接时,是否会再次起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接