2015-10-14 46 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) 
}