2015-12-29 45 views
10

在我的項目中,有4個Web服務在後臺運行。我想停止從當前狀態退出所有這些服務而無需等待響應。我發現這樣做的代碼取消所有來自Alamofire的Web服務呼叫

Alamofire.Manager.sharedInstance.session.invalidateAndCancel() 

但是在調用此之後,我無法再次進行服務調用。有什麼方法可以取消所有正在運行的請求嗎?

這裏是我的服務調用代碼

func getAllCount(parameters: [String: AnyObject],completion: (success : Bool) -> Void) { 

      PKHUD.sharedHUD.contentView = PKHUDTextView(text: "Loading...") 
      PKHUD.sharedHUD.show() 
      request = Alamofire.request(.POST, GlobalConstants.KGetAllCount, parameters: parameters, encoding:.JSON).responseJSON 
       { 
        response in switch response.result { 
        case .Success(let JSON): 
         PKHUD.sharedHUD.hide() 
         print("Success with JSON: \(JSON)") 
         let status : NSString = JSON.valueForKey("status") as! String 
         if(status .isEqualToString("1")){ 
          MyViewState.QJoined = JSON.valueForKeyPath("data.TotalJoinQueue") as! String 
          MyViewState.Qstarted = JSON.valueForKeyPath("data.TotalCreatedQueue") as! String 
          MyViewState.Bumps = JSON.valueForKeyPath("data.TotalBump") as! String 
          completion(success: true) 

          break 
         }else{ 
          completion(success: false) 
          Helper.globalAlert(JSON.valueForKey("data") as! String) 
          break 
         } 
        case .Failure(let error): 
         PKHUD.sharedHUD.hide() 
         print("Request failed with error: \(error)") 
         completion(success: false) 
         break 

        } 
      } 
     } 
+0

您只能取消掛起的請求。如果請求正在執行,那就遲到了......您根本沒有運行Web服務。 – user3441734

+0

請仔細閱讀此答案http://stackoverflow.com/a/27022598/1030951 – HarshIT

回答

2
class func emptyArr() { 
     for(var i=0; i<arrReq.count; i++){ 
      request = arrReq.objectAtIndex(i) as? Alamofire.Request 
      request?.cancel() 
     } 
    } 
9

至於我可以告訴沒有明顯的/簡單的方法來重新創建會話。處理這個問題的建議方法是保存和排列請求static var requests = [Alamofire.Request?](),然後當你想停止所有請求時,你可以調用request.cancel()。使用這種方法,您將不得不在創建後附加每個請求。

class func stopAllRequests(){ 
    for request in MyClass.requests{ 
     if let request = request{ 
      request.cancel() 
     } 
    } 
} 

Similar Issue

+0

這對我來說是最好的方式來處理這個(和我在我的應用程序中使用的一個) –

+0

這將只取消一個類的請求。 –

+0

@JanakThakkar這裏的想法只是將你的所有請求存儲在一個數組中。這個數組可以在類之間共享或幫助管理類。 –

8

NSURLSession確實有這些方法返回你尚未完成的所有請求。你可以得到這些,通過它們循環並取消每一個 - 類似於人們在上面提出的建議。

if #available(iOS 9.0, *) { 
     Manager.sharedInstance.session.getAllTasksWithCompletionHandler { (tasks) -> Void in 
      tasks.forEach({ $0.cancel() }) 
     } 
    } else { 
     // Fallback on earlier versions 
     Manager.sharedInstance.session.getTasksWithCompletionHandler({ 
      $0.0.forEach({ $0.cancel() }) 
      $0.1.forEach({ $0.cancel() }) 
      $0.2.forEach({ $0.cancel() }) 
     }) 
    }