当后台请求快速完成时通知

时间:2015-10-14 13:28:03

标签: ios multithreading 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()

我应该如何通知主线程请求的结果?

2 个答案:

答案 0 :(得分:2)

延迟是由于您尝试在您使用NSNotificationCenter的同一主题上使用NSURLSession这一事实。尝试使用以下内容更新您对NSNotificationCenter的调用:

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

答案 1 :(得分:2)

我不知道你对主线程究竟是什么意思,如果那只是一个主线程(而不是另一个控制器或类似的东西)我认为你应该使用将在主线程上执行的闭包dispatch async。描述我写的内容的函数看起来像这样:

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()
}