質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2295閲覧

Swift3.1における非同期・同期通信について

cafe_takai

総合スコア27

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/08/13 02:46

###実施したいこと
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

semaphore.signal()
の部分を

swift

1defer { 2 semaphore.signal() 3}

にするとどうですか?

投稿2017/08/13 03:47

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cafe_takai

2017/08/13 03:56

MasakiHori様 うまく行きました。ありがとうございます。感謝です。 調べていた範囲ではdeferなど、全く出てきておらず、勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問