2014-10-23 9 views
8

Mam niestandardową klasę NSURLProtocol w celu dostarczenia danych testowych podczas eksperymentowania z Alamofire, ale nie wydaje się, aby była używana podczas wysyłania żądań za pomocą metody żądania Menedżera .Metoda canInitWithRequest w niestandardowej klasie NSURLProtocol nie jest wyzwalana podczas korzystania z Alamofire

Żądanie przechodzi i zwraca wynik w porządku, ale nie powoduje 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) 

Gdybym użyć prostego NSURLConnection, metoda canInitWithRequest nazywa się spodziewałem:

NSURLProtocol.registerClass(DBDummyURLProtocol) 

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

Czy robię coś nie tak? Czy to powinno działać z Alamofire?

Odpowiedz

16

Alamofire używa wewnętrznie NSURLSession, która nie respektuje klas protokołów zarejestrowanych za pomocą NSURLProtocol.registerClass(). Zamiast tego używa obiektu NSURLSessionConfiguration, który ma właściwość protocolClasses.

Niestety tej konfiguracji nie można zmienić, ponieważ sesja zawsze zwraca kopię, a właściwość nie jest zapisywalna.

Co można zrobić, to zamiast tworzyć własne wystąpienie z Alamofire.Manager i przekazać go zwyczaj NSURLSessionConfiguration

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

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

Warto wyjaśnić, że 'NSURLSession.shared' ma absolutnie respektować klas zarejestrowanych przy użyciu protokołu registerClass' '(_ :) jednak sesje utworzone przy użyciu dowolnych metod inicjalizujących (tj. nie sesji współdzielonej) nie. To ostatnie jest tym, czego używa Alamofire, i dlatego ignoruje 'registerClass (_ :)'. – paulvs

Powiązane problemy