2015-09-17 14 views
7

Ho un Swift classe 2.0 ApiManager usando Alamofire 2.0 con il seguente init: la funzioneAlamofire Manager con Swift 2.0 ottenendo Annullato

var manager:Manager 

init() { 
    var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:] 
    defaultHeaders["Authorization"] = "Bearer \(UserAccount.sharedInstance.token)" 

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    configuration.HTTPAdditionalHeaders = defaultHeaders 

    manager = Alamofire.Manager(configuration: configuration) 
} 

Esempio:

func getMe(completion:(jsonObject: NSDictionary) ->()) { 
    manager.request(.GET, Constants.apiURL + "me").responseJSON { request, response, result in 

     print(self.manager) //THIS LINE FIXES IT 

     switch result { 
     case .Success(let json): 
      completion(jsonObject: json as! NSDictionary) 
     case .Failure(let data, let error): 
      print("Error: \(__FUNCTION__)\n", data, error) 
     } 
    } 
} 

L'errore che ricevo:

Error Domain=NSURLErrorDomain Code=-999 "cancelled" 

Sembra che la richiesta venga annullata perché il gestore è stato deallocato. L'aggiunta dell'istruzione di stampa impedisce che il gestore venga deallocato e quindi funziona perfettamente. Ma sto cercando di trovare una soluzione migliore.

Qualsiasi aiuto sarebbe apprezzato!

risposta

13

stavo correndo a questo stesso problema, ho usato questo per risolvere il problema

class Session { 
    static let sharedInstance = Session() 

    private var manager : Manager? 

     func ApiManager()->Manager{ 
      if let m = self.manager{ 
       return m 
      }else{ 
       let defaultHeaders = ["X-Version":"Some header"] 

       let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
       configuration.HTTPAdditionalHeaders = defaultHeaders 

       let tempmanager = Alamofire.Manager(configuration: configuration) 
       self.manager = tempmanager 
       return self.manager! 
      } 
     } 
    } 

poi ho chiamato con

Session.sharedInstance.ApiManager().request(... 
+1

Grazie ! Questo ha risolto il mio problema. Ho appena aggiunto la riga 'static let sharedInstance = ApiManager()' alla mia classe, quindi l'ho chiamata proprio come hai detto tu. Apprezzo davvero il tuo aiuto! – Groarus

+0

@Groarus, hai usato 'static let sharedInstance = ApiManager()' o 'static let sharedInstance = ApiManager' ?. Il primo genera un errore. –