2014-10-23 1 views
8

У меня есть пользовательский класс NSURLProtocol для предоставления тестовых данных, пока я экспериментирую с Alamofire, но, похоже, он не используется при выполнении запросов через метод запроса менеджера ,метод canInitWithRequest в пользовательском классе NSURLProtocol не запускается при использовании Alamofire

Этот запрос проходит через и возвращает результат только штрафом, но не вызывает 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?

ответ

16

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") 
+0

стоит уточнить, что 'NSURLSession.shared' делает абсолютно уважать классы протокола зарегистрированных с помощью' RegisterClass (_ :) ' однако сеансы, созданные с использованием любых методов инициализации (т. е. не общего сеанса), нет. Последнее - то, что использует Alamofire, и поэтому игнорирует 'registerClass (_ :)'. – paulvs

 Смежные вопросы

  • Нет связанных вопросов^_^