Alamofire使って非同期画像読み込み

このAlamofireは、iOS界ではメジャーと聞くAFNetworkなるライブラリを作ってた人がSwiftで書き下ろした、新進気鋭なるものということです。AFNetworkが世に出たらしい時期は私にとって金勘定に専念していた技術的ブランク時期だったためにまったく知らなんだが、技術力高く信頼感あるという雰囲気はちょっと見るだけで伝わって来る。その発展系?のこれはたった一つの.swiftファイルでたしかに綺麗なコードです。extensionで省力かつコードブロックを見通し良く書くのは参考になります。利用においてちょっと面倒なのはFrameworkにコンパイルされて動的バインドする仕掛けなので、プロジェクト設定に一手間必要な事でしょうか。たぶん.swiftファイルをプロジェクトに突っ込むだけでOKっぽい気もするけど。。。今回は言われる通りにちゃんと設定しました。

追記:Alamofire.swiftだけをプロジェクトに放り込んだもの作ってみたけど、エミュレータではちゃんと動きました。

Alamofireでなんかやってみようということで、画像を非同期に読み込んで表示するのに使ってみます。幅120のUIImageViewを貼っておいて、viewDidLoadでいじります。写真はFacebookから持ってきたので、いつも四角く使われているものですけど、おまけでSNSっぽく丸くしておきました。

import UIKit
import Alamofire

class ViewController: UIViewController {
    
    @IBOutlet weak var photoImage: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        photoImage.layer.cornerRadius = 60
        photoImage.layer.masksToBounds = true
        
        let req = request(.GET, "https://graph.facebook.com/masataka.kurihara/picture?type=large")
        req.response() { (request, response, data, error) in
            if error == nil {
                dispatch_async(dispatch_get_main_queue()) { () in
                    self.photoImage.image = UIImage(data: data as NSData)
                }
            }
        }
    }

あっけないけど、これで非同期通信できちゃう。Facebookの顔写真は認証もなにもなしで取れるのであっけないし、サンプルなんでエラー処理があっけなく超怪しいです。errornil判定だけで良いわけなさそう。

f:id:masataka_k:20141022065241p:plain

今回はGETなのでパラメータはURLに含んでますが、別途に引数で渡したりもできます。いまさらながら気がつきましたが、引数を省略OKな書き方あるのですね。requestの関数ヘッダは本当は以下でした。parametersおよびencodingは初期値設定されているので書かなくてよい。

    public func request(method: Method, URLString: URLStringConvertible,
        parameters: [String : AnyObject]? = nil, encoding: Alamofire.ParameterEncoding = .URL)
     -> Request

原典は以下です。

The Swift Programming Language: Functions

Place parameters with default values at the end of a function’s parameter list. This ensures that all calls to the function use the same order for their non-default arguments, and makes it clear that the same function is being called in each case.

ということです。