2016-08-23 23 views
5

Tôi có một lớp NetworkRequest, nơi mà tất cả các yêu cầu alamofire tôi thực hiện:nhanh chóng, alamofire hủy yêu cầu trước

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

Và tôi cần phải hủy bỏ yêu cầu downloadData trước, khi mới bắt đầu, cố gắng để hủy bỏ sử dụng currentRequest? .cancel(), nhưng nó không giúp được gì.

Đã cố gắng hủyHoạt động bằng NSOperationsBlock, nhưng nó không hủy hoạt động hiện tại.

Tôi chặn giao diện người dùng ngay bây giờ để người dùng không thể gửi yêu cầu khác. Nhưng điều này là không đúng, gây ra một số lỗi sau ...

Xin vui lòng, giúp

Trả lời

0

Nếu bạn muốn hủy bỏ yêu cầu, bạn cần phải theo dõi các yêu cầu thực hiện và cố gắng hủy bỏ nó. Bạn có thể lưu trữ nó trong một mảng và hủy bỏ mọi yêu cầu trước đó được lưu trữ. Trong mã của bạn, bạn tạo một yêu cầu: let request = Alamofire.request(.GET, url, headers: headers) nhưng bạn cố gắng hủy currentRequest?.cancel() không bao giờ được đánh giá.

+0

Tôi khá mới trong việc nhanh chóng và lập trình. Làm thế nào tôi có thể lưu trữ các yêu cầu trong mảng và hủy bỏ chúng? –

+0

Bạn có thể lưu nó vào một mảng, nhưng trước tiên hãy kiểm tra đề xuất của tôi – ciccioska

1

Tìm thấy giải pháp cần thiết:

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

Bây giờ trên là không có sẵn, bạn nên sử dụng this giải pháp:

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

và nếu bạn muốn hủy bỏ (đình chỉ, sơ yếu lý lịch) một đặc biệt yêu cầu bạn có thể kiểm tra url yêu cầu trong khối .forEach như sau:

dataTasks.forEach 
      { 
       if ($0.originalRequest?.url?.absoluteString == url) 
       { 
        $0.cancel() 
       } 
      } 
Các vấn đề liên quan