2014-10-23 7 views
8

Ho una classe NSURLProtocol personalizzata per fornire dati di test mentre sto sperimentando con Alamofire, ma non sembra essere utilizzata quando si effettuano richieste tramite il metodo di richiesta di Manager .Il metodo canInitWithRequest nella classe NSURLProtocol personalizzata non viene attivato quando si utilizza Alamofire

Questa richiesta passa attraverso e restituisce un risultato più che bene, ma non attiva 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) 

Se io uso un semplice NSURLConnection, il metodo canInitWithRequest si chiama come mi aspettavo:

NSURLProtocol.registerClass(DBDummyURLProtocol) 

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

Sto facendo qualcosa di sbagliato? Dovrebbe funzionare con Alamofire?

risposta

16

Alamofire utilizza NSURLSession internamente che non rispetta le classi di protocollo registrate utilizzando NSURLProtocol.registerClass(). Invece utilizza un oggetto NSURLSessionConfiguration che ha una proprietà protocolClasses.

Purtroppo questa configurazione non può essere modificata poiché la sessione restituisce sempre una copia e la proprietà non è scrivibile.

Che cosa si può fare, invece è creare la propria istanza di Alamofire.Manager e passarlo un costume NSURLSessionConfiguration

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

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

Vale la pena chiarire che 'NSURLSession.shared' non fa assolutamente rispettare le classi protocollo registrato usando' registerClass (_ :) ' tuttavia, le sessioni create utilizzando qualsiasi metodo di inizializzazione (cioè non la sessione condivisa) non lo fanno. Quest'ultimo è ciò che Alamofire utilizza, ed è per questo che ignora 'registerClass (_ :)'. – paulvs

Problemi correlati