Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从URLSession完成处理程序函数Swift 3返回字符串_Ios_Swift_Swift3_Nsurlsession_Completionhandler - Fatal编程技术网

Ios 从URLSession完成处理程序函数Swift 3返回字符串

Ios 从URLSession完成处理程序函数Swift 3返回字符串,ios,swift,swift3,nsurlsession,completionhandler,Ios,Swift,Swift3,Nsurlsession,Completionhandler,我需要这个函数(从数据库中获取一些数据)来返回一个字符串,但我很难弄清楚如何返回。我发现了一些类似的问题/解决方案,但我仍在努力实施一个合适的解决方案(我对swift非常陌生) 谢谢 您的会话.dataTask(with:方法是异步的。这意味着它将“在后台”执行,并通知您何时从它的调用中获得响应。它将在会话下面的块内通知您这一点。dataTask(with:部分在“{}/code>中”。就像出现一样,您正在对接收到的JSON进行一些处理,并将其格式化为希望从此函数返回的字符串。但是在调用完成之前

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


谢谢

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

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) 在函数内部调用您的completion,并传回一个
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) 用法:

非常接近于被愚弄。
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()
}
}
Helper().pReq(jsonURL: jsonURL, col: col) { (success, string) in
    if success {
        print("Success: \(string)")
    }
    else {
        print("Failure: Unable To Get String")
    }
}