【问题标题】:Return String from URLSession Completion Handler function Swift 3从 URLSession 完成处理函数 Swift 3 返回字符串
【发布时间】:2017-06-22 17:41:23
【问题描述】:

我需要这个函数(它从数据库中获取一些数据)来返回一个字符串,但我无法弄清楚如何。我发现了一些类似的问题/解决方案,但我仍在努力实施适当的解决方案(我对 swift 很陌生)

class Helper{
static func pReq(jsonURL : String, col : String) -> String {
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)
    let url  = URL(string: jsonURL)!
    let request = URLRequest(url: url)
    var string = ""

    let downloadTask = session.dataTask(with: request, completionHandler: {(data, response, error) in
        if(error == nil){ 
            print("data = \(String(describing: data))")
            do{
                print(jsonURL)
                let dataDownloadedAsJson = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject]
                print("dataDownloadedAsJson = \(dataDownloadedAsJson)")
                do{

                    if(dataDownloadedAsJson[col] as? String != nil){
                        string = (dataDownloadedAsJson[col] as? String)!

                    }
                }
            }
            catch{
            }
        }
        else{
            print("Error downloading data. Error = \(String(describing: error))")
        }
    })
    downloadTask.resume()
    return string
}
}

谢谢!

【问题讨论】:

标签: ios swift swift3 nsurlsession completionhandler


【解决方案1】:

您的session.dataTask(with: 方法是异步的。这意味着它将“在后台”执行,并通知您何时完成从它的调用中获得响应。它会在“{}”内的session.dataTask(with: 部分下方的块内通知您这一点。好像出现了,您正在对收到的 JSON 进行一些处理,并将其格式化为您希望从此函数返回的字符串。 但是在您的通话完成之前,您在底部被称为return string,因此您将不会返回""。你真正需要做的不是从你的函数中返回任何东西,而是使用一个完成块:

1) 在文件顶部声明:

typealias StringCompletion      = (_ success: Bool, _ string: String) -> Void

2) 修改你的函数来为你的完成提供一个参数

// This
static func pReq(jsonURL : String, col : String) -> String

// Becomes This
static func pReq(jsonURL : String, col : String, completion: @escaping StringCompletion)

3) 在你的函数内部调用你的完成并传回一个Bool 以表明它是一个成功的调用并传回string

class Helper{
static func pReq(jsonURL : String, col : String, completion: @escaping StringCompletion) {
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)
    let url  = URL(string: jsonURL)!
    let request = URLRequest(url: url)
    var string = ""

    let downloadTask = session.dataTask(with: request, completionHandler: {(data, response, error) in
        if(error == nil){ 
            print("data = \(String(describing: data))")
            do{
                print(jsonURL)
                let dataDownloadedAsJson = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject]
                print("dataDownloadedAsJson = \(dataDownloadedAsJson)")
                do{

                    if(dataDownloadedAsJson[col] as? String != nil){
                        string = (dataDownloadedAsJson[col] as? String)! 
                        completion(true, string)
                    }
                }
                catch { completion(false, string) }
            }
            catch{
                completion(false, string)
            }
        }
        else{
            print("Error downloading data. Error = \(String(describing: error))")       
            completion(false, string)
        }
    })
    downloadTask.resume()
}
}

4) 用法:

Helper().pReq(jsonURL: jsonURL, col: col) { (success, string) in
    if success {
        print("Success: \(string)")
    }
    else {
        print("Failure: Unable To Get String")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多