3
3

More than 5 years have passed since last update.

[ReactiveCocoa] RACCommand の挙動の確認

Last updated at Posted at 2014-11-10

RACCommand は エラー時も正常終了時も Completed が呼ばれる

class API {
  class func rac_login() -> RACSignal {
    return RACSignal.createSignal({ (subscriber) in
        // API call
        if error != nil {
          subscriber.sendError(error)
        } else {
          subscriber.sendCompleted()
        }
        return nil
    })
  }
}

let command = RACCommand(signalBlock: { _ in API.rac_login() })
command.executionSignals.subscribeNext({
  let signal = $0 as RACSignal
  signal.subscribeCompleted({  println("Error時もCompleted時もよばれちゃう。。") })
})
command.errors.subscribeNext({ println("こっちは Error時だけ呼ばれる \($0)") })

RACCommand の signal が sendError の時も sendCompleted も subscribeCompleted に入ってきてしまうことを確認するコードです。

エラーが起こった時には、subscribeCompletederrors.subscribeNext の両方が呼ばれてしまい、エラーの時と正常終了時とで、処理をきっちり分けたいときとかに困っちゃいました。。

エラー時と正常終了時で処理を分けたいときは

しかたがないので、API の結果を送るところで

  class func rac_login() -> RACSignal {
    return RACSignal.createSignal({ (subscriber) in
        // API call
        if error != nil {
          subscriber.sendError(error)
        } else {
          subscriber.sendNext(true)
          subscriber.sendCompleted()
        }
        return nil
    })
  }

ってして、executionSignals.flatten() で対応しました。。

command.executionSignals.flatten().subscribeNext({ println("こっちは正常終了の時だけ呼ばれる \($0)") })
command.errors.subscribeNext({ println("こっちはエラーの時だけ呼ばれる \($0)") })
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3