2014-10-23 17 views
8

Tôi có lớp NSURLProtocol tùy chỉnh để cung cấp dữ liệu thử nghiệm trong khi đang thử nghiệm với Alamofire, nhưng dường như nó không được sử dụng khi thực hiện yêu cầu thông qua phương thức yêu cầu Manager .phương thức canInitWithRequest trong lớp NSURLProtocol tùy chỉnh không được kích hoạt khi sử dụng Alamofire

Yêu cầu này đi qua và trả về một kết quả tốt, nhưng không kích hoạt 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) 

Nếu tôi sử dụng một NSURLConnection đơn giản, phương pháp canInitWithRequest được gọi như tôi mong đợi:

NSURLProtocol.registerClass(DBDummyURLProtocol) 

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

Tôi có làm gì sai không? Điều này có phù hợp với Alamofire không?

Trả lời

16

Alamofire sử dụng NSURLSession nội bộ không tôn trọng các lớp giao thức đã đăng ký sử dụng NSURLProtocol.registerClass(). Thay vào đó, nó sử dụng một đối tượng NSURLSessionConfiguration có một thuộc tính protocolClasses.

Rất tiếc, không thể thay đổi cấu hình này vì phiên luôn trả về bản sao và thuộc tính không thể ghi được.

gì bạn có thể làm thay vào đó là tạo ra ví dụ của riêng bạn Alamofire.Manager và vượt qua nó một tùy chỉnh NSURLSessionConfiguration

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

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

Worth làm rõ rằng 'NSURLSession.shared' không hoàn toàn tôn trọng các lớp giao thức registered sử dụng' registerClass (_ :) ' tuy nhiên, các phiên được tạo bằng cách sử dụng bất kỳ phương thức khởi tạo nào (tức là không phải phiên chia sẻ) thì không. Sau đó là những gì Alamofire sử dụng, và đó là lý do tại sao nó bỏ qua 'registerClass (_ :)'. – paulvs

Các vấn đề liên quan