酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

BrightFuturesで非同期処理実行後にクラッシュしてしまう

メモ。

BrightFuturesで非同期処理実行後にクラッシュしてしまう不具合があった。原因がわからず数回試行してみて、下記のメッセージ部分でクラッシュしていることがわかった。

Attempted to completed an Async that is already completed. This could become a fatal Error.

なぜ、Asyncが終了してしまっているのか理由がわからなかったが2回終了させていた。実際にはもう少し複雑な条件があるんだけど、クラッシュしていたのは以下のような場合でした。

static func foo() -> Future<Bool, APIError> {
    let promise = Promise<Bool, APIError>()

    Alamofire.request(ConstValues.uri).responseJSON { (response) in
        if isBoo {
            promise.success(true)
        }
        promise.failure(APIError.invalidOperation)
    }
    
    return promise.future
}

if文の判定で処理が成功したと判定してpromise.success(true)を返しておきながら、returnするのを忘れており、そのままpromise.failure(APIError.invalidOperation)を返していました。