2016-08-23 16 views
5

をキャンセルalamofire:迅速、私はすべての私のalamofire要求がなさNetworkRequestクラス、持っている前の要求

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を使用して操作をキャンセルしようとしましたが、現在の操作はキャンセルされません。

私は今UIをブロックしているので、ユーザーは別のリクエストを送信できません。しかし、これは正しくない、あなたが要求をキャンセルしたい場合は、あなたが行った要求をトレースし、それをキャンセルしようとする必要がある

答えて

0

を助け、多少の誤差は後で...

Plsの原因となります。配列に格納し、格納されている前のすべての要求を取り消すことができます。 コードでは、要求を作成します。 let request = Alamofire.request(.GET, url, headers: headers) ただし、値のないcurrentRequest?.cancel()を取り消そうとします。必要な解決策が見つかりました

+0

私は素早くプログラミングではかなり新しいです。リクエストを配列に格納してキャンセルするにはどうすればよいですか? –

+0

あなたはそれを配列に格納できますが、まず私の提案をチェックしてください – ciccioska

1

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

、あなたはキャンセル(中断、再開)したい場合は特に:Alamofire 4今すぐAlamofire.Manager.sharedInstance.session

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

あなたがthisソリューションを使用する必要があります使用できません。あなたの.forEachブロックのリクエストURLを次のように確認できます:

dataTasks.forEach 
      { 
       if ($0.originalRequest?.url?.absoluteString == url) 
       { 
        $0.cancel() 
       } 
      } 
関連する問題