2016-08-23 4 views
5

У меня есть класс NetworkRequest, где сделал все мои просьбы alamofire:быстры, alamofire отменить предыдущий запрос

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

И мне нужно, чтобы отменить предыдущий запрос downloadData, когда новый начинается, пытался отменить с помощью currentRequest? .cancel(), но это не помогает.

Уже пытался отменить операции с использованием NSOperationsBlock, но он не отменяет текущую работу.

Теперь я блокирую пользовательский интерфейс, чтобы пользователь не мог отправить другой запрос. Но это не правильно, вызывает некоторые ошибки позже ...

Pls, помочь

ответ

0

Если вы хотите отменить запрос, необходимо отслеживать запросы, сделанные и попытаться отменить его. Вы можете сохранить его в массиве и отменить каждый предыдущий запрос. В вашем коде вы создали запрос: let request = Alamofire.request(.GET, url, headers: headers) , но вы пытаетесь отменить currentRequest?.cancel(), который никогда не ценится.

+0

Я довольно новый в быстром и программировании. Как я могу хранить запросы в массиве и отменять их? –

+0

Вы можете сохранить его в массиве, но прежде всего проверьте мое предложение – ciccioska

1

Найдено требуется решение:

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

Сейчас на Alamofire 4, Alamofire.Manager.sharedInstance.session не доступен, то вы должны использовать this решение:

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

и если вы хотите отменить (приостановить, возобновить) конкретный просьба проверить адрес запроса в вашем блоке .forEach следующим образом:

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