2015-10-14 42 views
0

我向後端服務器發送請求,我需要知道正確的方式來通知我的主線程響應。我正在使用NSNotificationCenter執行此任務,但這有時不起作用,並且在工作時有一些延遲,因爲當我正在調試時,我可以看到控制檯何時打印結果,但幾秒後才能看到相應的警報。當後臺請求快速完成時通知我

這裏是我的要求:

let request1 = NSMutableURLRequest(URL: NSURL(string: serverID)!) 
    request1.HTTPMethod = "GET" 
    for key in parameters.keys{ 
     request1.addValue(parameters[key] as String!, forHTTPHeaderField: key) 
    } 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request1) { 
     data, response1, error in 
     if error != nil { 
      print("error=\(error)") 
      NSNotificationCenter.defaultCenter().postNotificationName("request1Error", object: self) 
      return 
     } 
     else { 
      let httpResponse = response1 as! NSHTTPURLResponse 
      let headers = httpResponse.allHeaderFields as NSDictionary 
      let sucess: AnyObject? = headers.objectForKey("UserId") 
      if (sucess != nil){ 
       let value = headers.valueForKey("info") as! String 
       print("info: \(value)") 
       NSNotificationCenter.defaultCenter().postNotificationName("sucessRequest", object: self) 

      } 
      else{ 
       NSNotificationCenter.defaultCenter().postNotificationName("requestError2", object: self) 

      } 

     } 
    } 
    task.resume() 

我應該如何通知我的主線程的請求的結果?

+0

呼叫調度異步和跨上主線程。有什麼問題? – matt

+0

我應該如何調用異步調度並進入主線程?問題是postNotification有時會失敗,並且延遲運行觀察者。 – DrCachetes

+0

延遲是因爲你沒有做我剛纔所說的。 – matt

回答

2

我不知道究竟你的意思是與主線程,如果這僅僅是一個主線程(而不是另一個控制器或類似的東西)我認爲你應該使用,將獲得通過使用說明是我寫的是這樣類似的調度async.A功能在主線程上執行關閉:

func request(onSuccess : (value:String) -> Void, onError:()->Void){ 

    let request1 = NSMutableURLRequest(URL: NSURL(string: serverID)!) 
    request1.HTTPMethod = "GET" 
    for key in parameters.keys{ 
     request1.addValue(parameters[key] as String!, forHTTPHeaderField: key) 
    } 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request1) { 
     data, response1, error in 
     if error != nil { 
      print("error=\(error)") 
      NSNotificationCenter.defaultCenter().postNotificationName("request1Error", object: self) 
      return 
     } 
     else { 
      let httpResponse = response1 as! NSHTTPURLResponse 
      let headers = httpResponse.allHeaderFields as NSDictionary 
      let sucess: AnyObject? = headers.objectForKey("UserId") 
      if (sucess != nil){ 
       let value = headers.valueForKey("info") as! String 
       print("info: \(value)") 

       dispatch_async(dispatch_get_main_queue(),{ 

        onSuccess(value) 
       }) 

      } 
      else{ 

       dispatch_async(dispatch_get_main_queue(),{ 

        onError() 
        }) 
      } 

     } 
    } 
    task.resume() 
} 
+0

這實際上是正確的方法。 – matt

2

延遲是由於您嘗試在您使用NSURLSession的同一線程上使用NSNotificationCenter所致。試着沿東西線更新您的來電來NSNotificationCenter

dispatch_async(dispatch_get_main_queue()) { 
    NSNotificationCenter.defaultCenter().postNotificationName("sucessRequest", object: self) 
}