关于 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打印为空,但是放到上面打印就可以得到结果),请问我该怎么改进?

阅读 4.4k
1 个回答

下面的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")
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进