###実施したいこと
iOSにおいて非同期通信にてJSONデータを取得して、それを表示したいと考えています。
###記載したプログラムと聞きたいこと
JSONデータを表示できるようこちらの動画を参考にしながら、次のようにプログラムを記載してみましたが、関数内deb1の箇所では値は得られているのですが、viewDidLoadのdeb2場所で値を得られることができません(http通信できる設定は行なっています)。
これでは非同期で通信したままで、結果を同期できていないと考えているのですが何分、対応が分からずにおります。
ご教授のほど、お願いいたします。
Swift
1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 let queue = DispatchQueue.global(qos: .default) 9 queue.async { 10 let dat1 = self.getValue("GBP") 11 let dat2 = self.getValue("USD") 12 print ( "deb2 ", dat1 ) 13 print ( "deb2 ", dat2 ) 14 DispatchQueue.main.async { 15// 表示するCODE 16 } 17 } 18 } 19 20 override func didReceiveMemoryWarning() { 21 super.didReceiveMemoryWarning() 22 } 23 24 func getValue(_ key : String) -> Double? { 25 // 戻り値 26 var res: Double? = nil 27 // セマフォを0で生成 28 let semaphore = DispatchSemaphore(value: 0) 29 30 let url = URL(string: "http://api.fixer.io/latest") 31 let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 32 semaphore.signal() 33 if error != nil 34 { 35 print("ERROR") 36 } 37 else 38 { 39 if let content = data 40 { 41 do 42 { 43 let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 44 if let rates = myJson["rates"] as? NSDictionary 45 { 46 if let currency = rates[key] 47 { 48 print(currency) 49 res = currency as? Double 50 print("deb1 ", res) 51 } 52 } 53 } 54 catch 55 { 56 print("ERROR") 57 } 58 } 59 } 60 } 61 task.resume() 62 semaphore.wait() 63 return res 64 } 65} 66
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/13 03:56