使用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值,直到为时已晚......看着代表们?我试过了,但后来我遇到了完成块......
答案 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()
}