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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

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

Swift

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

Q&A

解決済

1回答

4651閲覧

Alamofireにて同期通信を行う方法

mcddx330

総合スコア14

iOS

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

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

Swift

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

0グッド

3クリップ

投稿2016/01/02 17:30

編集2016/01/03 10:03

初めまして。

現在Swiftの勉強も兼ねてネット上のJSONデータを取得して処理を行う簡単なプログラムを作成しています。
その中で通信系で有名とのことでAlamofireを導入し、特定のJSONデータをパースして返却するという基礎的な部分を作成しているのですが、タイトルの通り非同期通信が常に行われてしまうせいか値が入らない状態となり困っています。

具体的には、

lang

1let testData = getData(); 2print(testData); // (1) 3 4func getData() -> NSData { 5 var result_data = NSData(); 6 7 Alamofire.request(.GET, <JSONのURL>).responseJSON { 8 response in 9 10 if let dt = response.data { 11 result_data = dt; 12 } 13 print(result_data) // (2) 14 15 } 16 17 return result_data; 18}

のような書き方をし、JSONデータの入ったresult_dataを呼び出し元のtestDataへ入れたいと考えていますが、
この動作を行うとtestDataには何も入っておらず(1)、数秒待ってからJSONの中身が出力される状況です。(2)

テーブルの更新やボタンを押した際の処理などといったケースでは問題ないのですが、今回作成したい処理は
「メソッドを呼び出した段階で取得完了まで行い、そこから整形を行った上で返却したい」
為、非同期ではなく同期式で書きたいと考えています。
ですが、検索を行ってもヒットする文献のほとんどが非同期方法しか書いておらず困っています。

何か書き方等ご存知でしたら教えて頂けませんでしょうか。
もしくはNSURLSession等をそのまま使用したほうが良いのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

直接の回答にはなっていませんがもし非同期通信ではなく同期通信をメインスレッドで行った場合、
その間は画面が固まりますが問題ないのでしょうか。
通信の場合、どんなにシンプルな通信でも通信環境(回線、接続先サーバの状態、レスポンスの量など)によっても瞬時にレスポンスを受け取ることが出来ない可能性もあります。

しかしながら実装上、通信を行った結果を受け取った後に処理を行って画面を表示するという実装は少なくはありません。(個人的には、少なくないどころが大半なんですが)
一般的なのかはわかりませんが、通信中はプログレスなどを表示してデータの受け取りが完了したら、
画面を再描画するなどの実装もあります。

今回の場合は勉強ということなので、試しに以下のようなコードを書いてみるのはいかがでしょうか。

  1. 処理の途中で別スレッドを生成して、そのスレッド内で通信を行う
  2. 通信結果が受け取れたらスレッドを終了する
  3. 呼び出し側は別スレッドが終了するまで待機する
  4. 受け取った値を使用して処理する

参考になれば幸いです。

投稿2016/01/05 09:37

YasuhiroMiyake

総合スコア1336

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問