swift - 关于 URLSession 的 HTTP 请求封装的问题

查看:122
本文介绍了swift - 关于 URLSession 的 HTTP 请求封装的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

正在学习swift,想用URLSession封装一个简单的GET请求类,代码如下

func myreq(url:String) -> JSON{
    var myjson:JSON = []
    let myurl = URL(string:url)
    var request = URLRequest(url:myurl!)
    request.httpMethod = "GET"
    let session = URLSession.shared

    let dataTask = session.dataTask(with:request, completionHandler:{ (data, response, error) in
        if error != nil{
            print(error!)
        }else{
            myjson = JSON(data!)
            //print(myjson)
        }
    })

    dataTask.resume()
    print(myjson)
    //返回一个JSON
    return myjson
}

这样是无法得到结果的(下面的myjson打印为空,但是放到上面打印就可以得到结果),请问我该怎么改进?

解决方案

下面的print是在主线程中执行的, 上面的print是在子线程中请求得到响应后, 再切换到主线程中执行.
改进:

func myreq(url:String, completion: @escaping (JSON?, Bool) -> ()){
    var myjson:JSON? = []
    let myurl = URL(string:url)
    var request = URLRequest(url:myurl!)
    request.httpMethod = "GET"
    let session = URLSession.shared
    
    let dataTask = session.dataTask(with:request, completionHandler:{ (data, response, error) in

        if error == nil {
            print(error!)
        } else {
            myjson = JSON(data!)
        }
        completion(myjson, isSuccess)
    })
    dataTask.resume()
}

调用:

myreq(url: "url") { (json, isSuccess) in
    print(json ?? "nil")
}

这篇关于swift - 关于 URLSession 的 HTTP 请求封装的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆