使用Alamofire时,不会触发自定义NSURLProtocol类中的canInitWithRequest方法

时间:2014-10-23 00:48:15

标签: alamofire

我有一个自定义的NSURLProtocol类来提供测试数据,而我正在尝试使用Alamofire,但在通过Manager请求方法发出请求时似乎没有使用它。

此请求通过并返回结果就好了,但是没有触发canInitWithRequest:

    NSURLProtocol.registerClass(DBDummyURLProtocol)

    class MyURLRequestConvertible : URLRequestConvertible {
        var URLRequest: NSURLRequest {
            return NSURLRequest(URL: NSURL(scheme: "http", host: "cnn.com", path: "/")!)
        }
    }
    var myURLRequestConvertible = MyURLRequestConvertible();
    Manager.sharedInstance.request(myURLRequestConvertible)

如果我使用简单的NSURLConnection,则按照我的预期调用canInitWithRequest方法:

    NSURLProtocol.registerClass(DBDummyURLProtocol)

    var request = NSURLRequest(URL: NSURL(scheme: "http", host: "cnn.com", path: "/")!)
    NSURLConnection(request: request, delegate:nil, startImmediately:true)

我做错了吗?这应该与Alamofire合作吗?

1 个答案:

答案 0 :(得分:18)

Alamofire在内部使用NSURLSession,不尊重使用NSURLProtocol.registerClass()注册的协议类。相反,它使用NSURLSessionConfiguration对象,该对象具有protocolClasses属性。

不幸的是,由于会话始终返回副本且属性不可写,因此无法更改此配置。

您可以做的是创建自己的Alamofire.Manager实例并将其传递给自定义NSURLSessionConfiguration

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.protocolClasses.insert(DBDummyURLProtocol.self, atIndex: 0)
let manager = Manager(configuration: configuration)

manager.request(.GET, "http://example.com")