我正在尝试使用RESTful API来返回一些json数据.我想封装创建HTTP请求的代码并在其自己的方法中设置标头,以便我可以通过输入url String来调用它,然后让方法返回一个JSON对象.
在下面的代码片段中,我已经创建了请求对象并设置了标题,我将该变量称为"req".我没有声明任何名为data,response或error的对象.我有以下代码正确打印出一个JSON对象
let sesh = NSURLSession.sharedSession()
let dataTask = sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) in
var jsonError : NSError?
let jsonBlob = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableLeaves, error: &jsonError)
println(jsonBlob)
});
dataTask.resume()
Run Code Online (Sandbox Code Playgroud)
所以这是我的问题.如何使这个completionHandler块能够返回类型为"AnyObject!"的jsonBlob?如果我稍微修改代码如下:
let sesh = NSURLSession.sharedSession()
let dataTask = sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) -> AnyObject! in
var jsonError : NSError?
let jsonBlob : AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableLeaves, error: &jsonError)
return jsonBlob
});
dataTask.resume()
Run Code Online (Sandbox Code Playgroud)
然后程序将不会编译为对dataTaskWithRequest的调用:completionHandler给出编译器警告说:
Could not find an overload for 'dataTaskWithRequest' that accepts the supplied arguments
Run Code Online (Sandbox Code Playgroud)
我不明白这一点.我正在使用正确的语法来返回闭包,如Swift Docs的这一页所示:
fuz*_*uzz 34
func getSomething(callback: (Array<AnyObject>) -> ()) {
var dataTask = NSURLSessionDataTask()
dataTask = session.dataTaskWithRequest(request) { (data, response, error) in
if (error == nil) {
var callbackArray = Array<MyObject>()
let responseDict = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: nil) as NSDictionary
let response = responseDict.objectForKey("response_key") as NSDictionary
let array = response.objectForKey("array_key") as NSArray
for item: AnyObject in array {
var arrayItem = MyObject(dict: item as NSDictionary)
callbackArray.append(arrayItem)
}
callback(callbackArray)
} else {
// handle an error
}
}
dataTask.resume()
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
getSomething() { (response) in
if let responseArray = response as? Array<MyObject> {
self.somethings = responseArray
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
32396 次 |
最近记录: |