2016-08-23 6 views
5

iptal alamofire:hızlı, ben bütün alamofire istekleri yapılmış bir NetworkRequest sınıfı, sahip önceki isteği

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() 
      } 
     } 
} 

Ve daha önceki downloadData isteği iptal gerekir, yeni bir başladığında, currentRequest kullanan iptal etmek çalıştı? .cancel(), ama yardımcı olmuyor.

Daha önce NSOperationsBlock kullanarak işlemi iptal etmeye çalıştı, ancak geçerli işlemi iptal etmiyor.

Artık kullanıcı arayüzünü engelliyorum, böylece kullanıcı başka bir istek gönderemiyor. Ama bu isteği iptal etmek isterseniz

Pls,

cevap

0

yardım ..., doğru değil bazı hatalar sonradan neden, yapmış istekleri izlemek ve iptal için denemek gerekir. Bir dizide saklayabilir ve önceden saklanan her isteği iptal edebilirsiniz. Kodunuzda, bir istek oluşturursunuz: let request = Alamofire.request(.GET, url, headers: headers) fakat asla değer verilmeyen currentRequest?.cancel()'u iptal etmeyi deneyin.

+0

Hızlı ve programlamada oldukça yeniyim. İstekleri dizide nasıl saklayabilir ve iptal edebilirim? –

+0

Bir dizide saklayabilirsiniz, ancak önce öneri kontrol et – ciccioska

1

Bulunan gerekli çözüm: Asistan

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

Eğer this çözüm kullanmalıdır kullanılamaz:

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

ve (askıya özgeçmiş) belirli iptal etmek istiyorsanız .forEach bloğundaki istek URL'sini şu şekilde kontrol edebilirsiniz:

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