AFNetworking と ReactiveCocoa を組み合わせる

ReactiveCocoa を導入したからには使い倒す方針でやっていて、 AFNetworking を使った Web API 呼び出しは、次のようにして RACSignal 化している。

let signal = RACSignal.createSignal({ (subscriber) -> RACDisposable! in
    let manager = AFHTTPRequestOperationManager(baseURL:  baseURL)

    let operation = manager.GET(
        path,
        parameters: parameters,
        success: { (operation, response) -> Void in
            subscriber.sendNext(response)
            subscriber.sendCompleted()
        },
        failure: { (operation, error) -> Void in
            subscriber.sendError(error)
        }
    )

    return RACDisposable(block: {
        operation.cancel()
    })
)
return signal

POST や PUT、DELETE も同じ。 たいして難しいコードじゃないけど、RACSignal 化するコードを何度も書くのはDRY じゃないよね。

実は、AFNetworking の拡張があったりする。

こいつを使えば、先ほどのコードを次のように書き変えることができる。

let manager = AFHTTPRequestOperationManager(baseURL:  baseURL)
let signal = manager.rac_GET(path, parameters: parameters)
return signal

成功・失敗のコールバックを引数で渡す必要がなくなって、見た目が非常にシンプル。