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

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

解決済

3回答

2102閲覧

classメソッドの返り値とAlamofireでの通信

Y_M

総合スコア265

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グッド

1クリップ

投稿2017/02/17 08:44

###前提・実現したいこと
classメソッド内にAlamofireでの通信を記載した際に、通信完了後に返り値を返却したい。
そもそもこの書き方に無理があるのか、別方法でできるのか。。。

###該当のソースコード

Swift

1class func search() -> JSON { 2 let param = ["count": 10000] 3 NetworkManager.sharedInstance.ApiManager().request("http://api.jp/api/api_search", method: .post, parameters: param, headers: header).responseJSON { response in 4 guard let object = response.result.value else { 5 print("Network -> Error") 6 return 7 } 8 let json = JSON(object) 9 } 10}

###試したこと
let json = JSON(object)のあとにreturn jsonを指定してみたが、
もちろん返り値を返すものではないためエラー

かと言ってNetworkManager.sharedInstance(以下略の括弧外に変数を宣言し、
returnすると通信完了より先に処理されてしまうのでnilが返ってしまいエラー

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode8.2.1
Swift3

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

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

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

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

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

guest

回答3

0

ベストアンサー

基本的に、通信が正常にできたらsuccess、失敗したらfailが呼ばれます。
ネットワーク通信になるので、基本的には非同期で行われる。
なので、無理にやろうとすると、意図しない動作となる可能性があります。

その上でやるのであれば、以下URLなどをご参考に。

http://www.toosaa.net/entry/2016/10/20/102617
https://teratail.com/questions/34385

本来的には、非同期を想定した作りにすべきかと思います。

投稿2017/02/17 08:54

t_obara

総合スコア5488

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

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

Y_M

2017/02/17 09:00 編集

ご回答ありがとうございます。 もし"t_obara"様が通信処理を別クラスに記載し、 非同期通信の完了後、呼び出し元のクラスにJSON型の値を返却した後に処理を行いたい。 という状況になった場合はどのように解決されますでしょうか。 やはり同クラス内に記載し、入れ子方式でやるのが確実でしょうか。
t_obara

2017/02/17 09:08

場合によりますが、単純には、同じクラスの別のメソッドを作成し、そのままそのメソッドを呼び出します。 jsonが処理に必要なのであれば(大抵は必要になるでしょうけれど)、引数でjsonを渡します。
Y_M

2017/02/17 09:12

やはりそうなりますよね。 別の質問を参考に、クロージャを使ったサンプルを作成してみました。 一応思った動作はしてくれているのですが、確認していただけますか。
t_obara

2017/02/17 09:27

クロージャでも全く問題ないですよ。単にクロージャを使うべき場合とそうでない場合で判断すれば良いと思います。
Y_M

2017/02/17 09:29

クロージャ自体あまり良くわかっていなのですが、見よう見まねで作ってみました。 現状知識不足でその判断ができないので、これを機会に触れてみようと思います。
guest

0

search()に「通信完了後に行う処理」のクロージャを渡してやればいいのではないでしょうか?

投稿2017/02/17 09:19

fuzzball

総合スコア16731

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

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

Y_M

2017/02/17 09:33

回答ありがとうございます。 絶妙にタイミングが><
guest

0

###クロージャを使った方法

Swift

1class func search(callback: @escaping (JSON) -> ()) { 2 let param = ["count": 10000] 3 NetworkManager.sharedInstance.ApiManager().request("http://api.jp/api/api_search", method: .post, parameters: param, headers: header).responseJSON { response in 4 guard let object = response.result.value else { 5 print("Network -> Error") 6 return 7 } 8 let json = JSON(object) 9 callback(json) 10 } 11}

###呼び出し元クラス

Swift

1override func viewWillAppear(_ animated: Bool) { 2 super.viewWillAppear(animated) 3 4 Newtwork.search { result in 5 print(result) 6 } 7}

投稿2017/02/17 09:16

Y_M

総合スコア265

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問