2014-10-23 7 views
8

Ich habe eine benutzerdefinierte NSURLProtocol-Klasse, um Testdaten während des Experimentierens mit Alamofire bereitzustellen. Bei Anfragen über die Manager-Anforderungsmethode wird sie jedoch nicht verwendet .Die canInitWithRequest-Methode in der benutzerdefinierten NSURLProtocol-Klasse wird nicht ausgelöst, wenn Alamofire verwendet wird

Dieser Antrag geht durch und gibt ein Ergebnis ganz gut, aber nicht auslösen 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) 

Wenn ich eine einfache NSURLConnection verwenden, wird die canInitWithRequest Methode aufgerufen, wie ich erwartet hatte:

NSURLProtocol.registerClass(DBDummyURLProtocol) 

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

Mache ich etwas falsch? Sollte das mit Alamofire funktionieren?

Antwort

16

Alamofire verwendet intern NSURLSession, das die unter Verwendung von NSURLProtocol.registerClass() registrierten Protokollklassen nicht berücksichtigt. Stattdessen verwendet es ein NSURLSessionConfiguration Objekt, das eine protocolClasses Eigenschaft besitzt.

Leider kann diese Konfiguration nicht geändert werden, da die Sitzung immer eine Kopie zurückgibt und die Eigenschaft nicht beschreibbar ist.

Was können Sie stattdessen tun ist, Ihre eigene Instanz von Alamofire.Manager erstellen und übergeben es eine benutzerdefinierte 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 klarstellt, dass 'NSURLSession.shared' absolut Protokoll-Klassen nicht respektiert registriert mit' register (_ :) ' Sitzungen, die mit Initialisierungsmethoden (dh nicht mit der gemeinsamen Sitzung) erstellt wurden, funktionieren jedoch nicht. Letzteres ist, was Alamofire verwendet, und deshalb ignoriert es 'registerClass (_ :)'. – paulvs

Verwandte Themen