2016-08-23 4 views
5

रद्द alamofire मैं एक NetworkRequest वर्ग है, जहां मेरे सारे 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(), लेकिन यह मदद नहीं करता है।

एनएसओपेरेशंसब्लॉक का उपयोग कर अपवादों को रद्द करने की कोशिश कर चुके हैं, लेकिन यह वर्तमान ऑपरेशन को रद्द नहीं करता है।

अब मैं UI को अवरुद्ध करता हूं, ताकि उपयोगकर्ता कोई अन्य अनुरोध न भेज सके। लेकिन यह सही नहीं है, कुछ त्रुटियाँ बाद का कारण बनता है ...

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
अब

पर उपलब्ध नहीं है आप 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() 
       } 
      }