Swift:为什么我的completionHandler闭包返回一个值?

时间:2014-12-31 11:02:30

标签: xcode swift

我正在尝试创建HTTP请求并返回一些JSON数据。它正确地连接到API并返回数据但是当我运行应用程序时它返回我打印的行("错误")而不继续通过应用程序。如果我删除println并继续通过断点,应用程序将永远运行,因为我无法继续通过断点。

我确信我对闭包应该如何工作有一些基本的误解。我在这里缺少什么?

func logIn() {

    var url = "https://www.photoshelter.com/psapi/v3/mem/authenticate?api_key=(api_key)&email=(email)&password=(password)&mode=token"
    var baseURL:NSURL? = NSURL(string: url)
    var request: NSMutableURLRequest? = NSMutableURLRequest(URL: baseURL!)
    var session = NSURLSession.sharedSession()
    var task = session.dataTaskWithRequest(request!, completionHandler: { (data, response, error) -> Void in
    println("Error")
    var responseObject = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil)

    })
    task.resume()
}
@IBAction func signInButton(sender: AnyObject) {
    logIn()
}

1 个答案:

答案 0 :(得分:2)

这种或者接近的变化是我几乎所有网络的工作方式。看起来你的实现并没有真正做任何事情。

func logIn() {
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    let url = NSURL(string: "https://www.photoshelter.com/psapi/v3/mem/authenticate?api_key=(api_key)&email=(email)&password=(password)&mode=token")
    let session = NSURLSession.sharedSession()

    // Request
    let request = NSMutableURLRequest(URL: url!)
    // You can set request properties like HTTPMethod and HTTPBody to customize things

    let loginUserDataTask = session.dataTaskWithRequest(request, completionHandler: { data, response, error in
        var success = false

        if let error = error {
            println("Failure! \(error)")
            if error.code == -999 { return }
        } else if let httpResponse = response as? NSHTTPURLResponse {
            if httpResponse.statusCode == 200 {
                if let array = parseJSON(data) {
                    success = true
                    // Do something with array
                }
            } else {
                println("Failure! \(response)")
            }
        }
        dispatch_async(dispatch_get_main_queue()) {
            UIApplication.sharedApplication().networkActivityIndicatorVisible = false
        }
    })
    loginUserDataTask?.resume()
}

这里有parseJSON:来处理数据:

func parseJSON(data: NSData) -> [AnyObject]? {
    var error: NSError?
    if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: &error) as? [AnyObject] {
        return json
    } else if let error = error {
        println("JSON Error: \(error)")
    } else {
        println("Unknown JSON Error")
    }
    return nil
}
相关问题