如何在Swift中使用completionHandler Closure返回?

 刁琼婉 发布于 2023-01-04 13:53

我正在尝试使用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()

所以这是我的问题.如何使这个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()

然后程序将不会编译为对dataTaskWithRequest的调用:completionHandler给出编译器警告说:

 Could not find an overload for 'dataTaskWithRequest' that accepts the supplied arguments

我不明白这一点.我正在使用正确的语法来返回闭包,如Swift Docs的这一页所示:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

1 个回答
  • 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()
    }
    

    然后你可以这样做:

    getSomething() { (response) in
        if let responseArray = response as? Array<MyObject> {
            self.somethings = responseArray
        }
    }
    

    2023-01-04 13:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有