2016-08-23 34 views
5

Mam klasy NetworkRequest, gdzie wszystkie moje prośby alamofire wykonany:Swift, alamofire anulować poprzedni wniosek

class NetworkRequest { 
     static let request = NetworkRequest() 

     var currentRequest: Alamofire.Request? 

     let dataManager = DataManager() 
     let networkManager = NetworkReachabilityManager() 
     let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 

     func downloadData<T: Film>(slug: String, provider: String, section: String, dynamic: String, anyClass: T, completion: ([T]?) -> Void) { 
      var token: String = "" 

      if LOGGED_IN == true { 
       token = "\(NSUserDefaults.standardUserDefaults().valueForKey(TOKEN)!)" 
      } 

      let headers = [ 
       "Access": "application/json", 
       "Authorization": "Bearer \(token)" 
      ] 

      let dataUrl = "\(BASE_URL)\(slug)\(provider)\(section)\(dynamic)" 
      print(headers) 
      print(dataUrl) 

      if networkManager!.isReachable { 

       currentRequest?.cancel() 

       dispatch_async(dispatch_get_global_queue(priority, 0)) { 

        if let url = NSURL(string: dataUrl) { 
         let request = Alamofire.request(.GET, url, headers: headers) 

         request.validate().responseJSON { response in 
          switch response.result { 
          case .Success: 
           if let data = response.result.value as! [String: AnyObject]! { 
            let receivedData = self.dataManager.parseDataToFilms(data, someClass: anyClass) 
            completion(receivedData) 
           } 

          case .Failure(let error): 
           print("Alamofire error: \(error)") 

           if error.code == 1001 { 
            self.goToNoConnectionVC() 
           } 

           print("canceled") 
          } 

         } 
        } 
       } 
      } else { 
       goToNoConnectionVC() 
      } 
     } 
} 

I muszę odwołać poprzednią prośbę downloadData, gdy nowa zaczyna, próbował anulować używając currentRequest? .cancel(), ale to nie pomaga.

Próbowano już anulować operacje przy użyciu blokady NSOperationsBlock, ale nie anuluje ona bieżącej operacji.

Blokuję teraz interfejs użytkownika, aby użytkownik nie mógł wysłać kolejnego żądania. Ale to nie jest poprawne, powoduje pewne błędy później ...

PLS pomóc

Odpowiedz

0

Jeśli chcesz anulować żądanie, trzeba prześledzić wnioski złożone i spróbować go anulować. Możesz zapisać go w tablicy i anulować wszystkie poprzednie zapisane żądania. W kodzie tworzysz żądanie: let request = Alamofire.request(.GET, url, headers: headers) , ale próbujesz anulować currentRequest?.cancel(), która nigdy nie jest wyceniana.

+0

Jestem całkiem nowy w szybkim tempie i programowaniu. Jak mogę przechowywać żądania w tablicy i anulować je? –

+0

Możesz zapisać go do tablicy, ale przede wszystkim sprawdź moją sugestię – ciccioska

1

Znaleziony potrzebne rozwiązanie:

func stopAllSessions() { 
    Alamofire.Manager.sharedInstance.session.getAllTasksWithCompletionHandler { tasks in 
     tasks.forEach { $0.cancel() } 
    } 
} 
9

Teraz na Alamofire 4, Alamofire.Manager.sharedInstance.session nie jest dostępny należy użyć this rozwiązanie:

let sessionManager = Alamofire.SessionManager.default 
sessionManager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in 
dataTasks.forEach { $0.cancel() } 
uploadTasks.forEach { $0.cancel() } 
downloadTasks.forEach { $0.cancel() } 
} 

a jeśli chcesz, aby anulować (zawiesić, wznowić) szczególna Żądaj, aby sprawdzić adres URL żądania w swoim bloku .forEach:

dataTasks.forEach 
      { 
       if ($0.originalRequest?.url?.absoluteString == url) 
       { 
        $0.cancel() 
       } 
      }