后台请求完成时通知 swift
Notify when a background request has finished swift
我正在向后端服务器发送请求,我需要知道将响应通知主线程的正确方法。我正在使用 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()
我应该如何通知我的主线程请求的结果?
延迟是因为您尝试在使用 NSURLSession
的同一线程上使用 NSNotificationCenter
。尝试使用以下内容更新对 NSNotificationCenter
的调用:
dispatch_async(dispatch_get_main_queue()) {
NSNotificationCenter.defaultCenter().postNotificationName("sucessRequest", object: self)
}
我不知道你对主线程到底是什么意思,如果这只是一个主线程(而不是另一个控制器或类似的东西)我认为你应该使用将在主线程上执行的闭包描述我写的内容的 dispatch 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()
}
我正在向后端服务器发送请求,我需要知道将响应通知主线程的正确方法。我正在使用 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()
我应该如何通知我的主线程请求的结果?
延迟是因为您尝试在使用 NSURLSession
的同一线程上使用 NSNotificationCenter
。尝试使用以下内容更新对 NSNotificationCenter
的调用:
dispatch_async(dispatch_get_main_queue()) {
NSNotificationCenter.defaultCenter().postNotificationName("sucessRequest", object: self)
}
我不知道你对主线程到底是什么意思,如果这只是一个主线程(而不是另一个控制器或类似的东西)我认为你应该使用将在主线程上执行的闭包描述我写的内容的 dispatch 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()
}