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

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

ただいまの
回答率

90.53%

  • Swift

    7217questions

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

AlamofireImageにはcompletionhandlerはないのでしょうか?

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 271

Kw6ZG2sV

score 56

Alamofireで非同期通信する際は、

Alamofire.request(.POST, url, parameters: parameters)
        .responseJSON { response in
            switch response.result {
                case .Success(let value):
                    completionHandler(value, nil)
                case .Failure(let error):
                    completionHandler(nil, error)
            }


このようにして、コールバック処理はconpletionHandlerが用意されていますが、
AlamofireImageの方にはないのでしょうか?
画像データを全て取得できたら、次の処理をするというようなことをしたいのですが、
それがないとなると皆様はどのように実装されてるのでしょうか?

知っている方がいらっしゃれば教えて頂けるとありがたいです。

追記:
ちなみにこのように自分の方ではAlamofireImageを使用しています。

Alamofire.request(url).responseImage { response in
                    debugPrint(response.result)
                    if let image = response.result.value {
                        print("image downloaded: \(image)")
                        let imgratio:CGFloat = (image.size.height)/(image.size.width)
                        let iw = CGFloat(self.sw)
                        let resize = image.ResizeÜIImage(width: iw, height: iw*imgratio)

                        self.banner.remove(at: Int(index)!)
                        self.banner.insert(resize!, at: Int(index)!)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

completionHandlerってAlamofireが用意しているものではないと思います。
質問のコードを含む関数の引数ではないですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/29 16:06

    そうなんですね!
    とすると、処理が完了してから呼ばれるものでもないということでしょうか?

    キャンセル

  • 2018/06/29 16:15

    呼ばれるんじゃなくて自分で呼ぶんですよ。

    completionHandler(value, nil)
    って、completionHandler()という関数を呼んでいるだけです。

    キャンセル

  • 2018/06/29 16:19

    わかりました!ありがとうございます!

    キャンセル

0

completionHandler自体は別途定義する必要があるかと思いますが、ImageDownloader使用すればを非同期で画像データを取得することができるかと思います。

Alamofire - ImageDownloader
https://github.com/Alamofire/AlamofireImage#downloading-an-image

func fetchImage(url: URL, completionHandler: (image: UIImage?) -> Void) {
  let downloader = ImageDownloader()
  let urlRequest = URLRequest(url: url)

  downloader.download(urlRequest) { response in
    if let image = response.result.value {
     completionHandler(image)
     return
    }

    completionHandler(nil)
  }
}

追記

func updateImageView() {
   self.fetchImage(url: URL("https://xxx.xxxx.co.jp/xxx.jpg")!, completionHanlder: { (image, error) in
      /*
          画像取得後の処理。
      */
  });
}

func fetchImage(url: URL, completionHandler: (image: UIImage?, error: NSError?) -> Void) {
  let downloader = ImageDownloader()
  let urlRequest = URLRequest(url: url)

  downloader.download(urlRequest) { response in
    switch response.result {
        case .Success(let image):
            completionHandler(image, nil)
        case .Failure(let error):
            completionHandler(nil, error)
     }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/29 16:04

    回答ありがとうございます。
    「ImageDownloaderを使用すれば非同期で取得できる」とありますが、
    そもそもAlamofireImageも非同期で取得できるものではないのでしょうか?

    キャンセル

  • 2018/06/29 16:26

    ImageDownloaderを使うと、completionでresponseを受け取れるという意味でした。伝え方がよくなかったですね。

    キャンセル

  • 2018/06/29 16:28

    そういうことだったのですね!ありがとうございます!

    キャンセル

  • 2018/06/29 16:29

    ドキュメントをさっとみただけだったので、見逃してしまってましたが`Alamofire.request`でもできるようですね。
    https://github.com/Alamofire/AlamofireImage#usage

    キャンセル

  • 2018/06/29 16:39

    今、質問本文に追記致しましたが、もともとAlamofireImageをそのように使用していたのですが、ここでデータの処理が終わり次第、何かの処理に移りたかったのですが、それができずに今回質問に至りました。私が追記したソース部分で完了したら処理するというようなことは可能だと思いますか?

    キャンセル

  • 2018/06/29 16:51

    debugPrint以降の処理って完了後の処理でしょ?

    キャンセル

  • 2018/06/29 17:03

    ということはこのままでやりたいことは出来ている(最初から完了後の処理に中に記載しているから)ということでしょうか?

    キャンセル

  • 2018/06/29 17:19 編集

    おおよそできてると思います。responseは受け取れているので、completionHandlerを定義してあげれば大丈夫です。画像データの処理の後に、次の処理を行うときはcompletionHandler内で実行すれば良さそうです。頑張ってください!

    回答に参考サンプルを追記しました。

    キャンセル

  • 2018/06/29 17:59

    サンプルありがとうございます!
    これはImageDownloaderを使用されたものですよね?
    私はAlamofireImageで頑張ってみます!

    キャンセル

0

やりたいことはこれじゃないのかな。

var yourImageView:UIImageView!

yourImageView.af_setImageWithURL(
    URL(string: "http://imageurl/hoge.png")!,
    placeholderImage: nil,
    filter: nil,
    imageTransition: .CrossDissolve(0.5),
    completion: { response in
        // ロード後処理
    }
)


参考

ちな、AlamofireImageはUIImageViewのextensionです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/29 16:19

    これは何を用いているのでしょうか...?
    AlamofireImageでcompletionというのはできないということでしょうか?

    キャンセル

  • 2018/06/29 16:25

    ”AlamofireImage.request( 〜 ”のような書き方はしませんよ。回答したとおり、UIImageViewのextensionとして提供されています。extensionが初耳ならそれから調べてください。

    キャンセル

  • 2018/06/29 16:40

    本文追記致しました。
    このような方法で非同期でAlamofireImageを使用していたのですが、これは間違っているのでしょうか...?

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    7217questions

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