控制Swift 2.0中的任务

时间:2016-01-26 20:24:29

标签: ios json swift

使用Xcode 7.2在IOS 9.2.1上使用Swift 2.0

学习Swift 2.0,我编写了一个创建NSURL会话的例程,获取一些JSON数据,然后解析它。它很棒...

但是我帮助理解如何使这个工作得到外部函数,share_list_folders等到任务在这里真正完成所以我可以返回结果?

var parsedJson:[String:AnyObject] = [:]

func shared_list_folders() {

    // **** list_folders (shared) ****
    let request = NSMutableURLRequest(URL: NSURL(string: "https://api.dropboxapi.com/2/sharing/list_folders")!)
    let session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"

    request.addValue("Bearer ab-XXX", forHTTPHeaderField: "Authorization")

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        //print("Response: \(response)")


        let strData = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("Body: \(strData)\n\n")
        do {
            let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers);               

                self.jsonParser(jsonResult)
                for (key, value) in self.parsedJson {
                    print("key2 \(key) value2 \(value)")
                }
        } catch {
            print("Bang")
        }
    })

    task.resume()
    let string2return = parsedJson["path_lower"] as? String
    return(string2return)!
}

它不是真的完成,因为任务会自动完成并且自己做的事情和share_list_folders会完成吗?显然我在这里没有获得path_lower值,直到为时已晚......看着代表们?我试过了,但后来我遇到了完成块......

1 个答案:

答案 0 :(得分:2)

正如你在恢复它之后注意到NSURLSession那样,任务就会消失,并且需要时间来完成它的工作。当你必须在另一个线程中计算/准备某些东西时处理情况时,它是异步编程的一部分。引擎盖下NSURLSession有自己的线程,等待服务器响应。然后在主线程上调用completionHandler。这是一个简化的理论。回到你的问题:

显然你必须等待服务器响应。与其他语言一样,代码是逐行执行的,因此您无法在编写时返回任何内容。答案是:使用closures

您声明的函数也可以使用委托,但让我们关注闭包:

func shared_list_folders(completion: (string: String?, error: ErrorType?) -> Void) {
    // **** list_folders (shared) ****
    let request = NSMutableURLRequest(URL: NSURL(string: "https://api.dropboxapi.com/2/sharing/list_folders")!)
    let session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"

    request.addValue("Bearer ab-XXX", forHTTPHeaderField: "Authorization")

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
    //print("Response: \(response)")
        if let error = error {
            completion(string: nil, error: error)
            return
        }

        let strData = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("Body: \(strData)\n\n")
        do {
            let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers);               

            let parsedJson = self.jsonParser(jsonResult) // I assume this returns parsedJson?
            let string2return = parsedJson["path_lower"] as? String

            completion(string: string2return, error: nil)
        } catch { // here we have an error
            completion(string: nil, error: error)
        }
    })

    task.resume()
}