2017-06-22 5 views
1

文字列を返すためにこの関数(データベースからデータを取得しています)が必要ですが、どうやって解決するのが問題です。 (私は迅速でかなり新しいです)URLSession Completion Handler関数Swift 3から返される文字列Swift 3

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 
} 
} 

おかげで私はいくつかの類似した質問/ソリューションを見つけたが、私はまだ、適切なソリューションを実装するために苦労しています!

+0

[この関連質問の】デュープに非常に近い(HTTPS:/を/stackoverflow.com/questions/24647406/how-to-use-completionhandler-closure-with-return-in-swift)。 –

答えて

2

session.dataTask(with:メソッドは非同期です。これは、「バックグラウンドで」実行することを意味し、コールからの応答を終了したときに通知します。それはあなたのブロックの中の{}の中のsession.dataTask(with:部分の下にこれをあなたに知らせます。表示されているかのように、受け取ったJSONで何らかの処理を行い、この関数から返りたい文字列にフォーマットします。 BUT電話が終了する前に、電話帳の下部にreturn stringと表示されているので、""は返されません。 )

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

2取るためにあなたの関数を変更します。

1)この頂上にあなたのファイルを宣言します。あなたが本当に行う必要があることはあなたの関数から何かを返すが、代わりに完了ブロックを使用していませんあなたの関数内で、あなたの完了

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

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

3)のためのパラメータは、あなたの完了を呼び出し、01バックパスは、それが成功したコールされたことを示すと同様に

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)使用stringバック渡す:

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