@discardableResult for andThen?
zgthompson opened this issue · 7 comments
I believe andThen should have a discardable result to remain consistent with onSuccess and onFailure.
Thanks for your suggestion.
andThen
returns a new future that can be used to control the order in which callbacks are executed. If you don't care about the order, use onSuccess
etc. If you do care about the order, you'll be using andThen
and do something with the result.
Perhaps I am missing a use case here, can you provide some more details?
We sometimes use andThen
to prevent code redundancy when some logic should be executed in both onSuccess
and onFailure
callbacks.
As an example, you may want to update the UI of your view controller on both success and failure:
self.startActivityIndicator()
service.performAPICall.onSuccess {
doSomeWorkOnSuccess()
}.onFailure {
showErrorMessage()
}.andThen {
self.stopActivityIndicator()
}
In this case the result of andThen
will never be used.
Did you consider using onComplete
instead of andThen
?
No, I guess I missed this one. :)
Many thanks !
I am using andThen in a similar way as @tdesert. I hadn't considered using onComplete. I think semantically andThen reads better for someone who may not be familiar with futures, since onSuccess/onFailure/andThen conceptually matches try/catch/finally or try/catch/defer. I'd be interested to hear others opinions though, since that is just my interpretation.
Another use case I have is in my unit tests. I often have an onSuccess block followed by an onFailure block followed by an andThen block. The andThen block is where my XCTestExpectation gets fulfilled. If I change that to an onComplete block is it guaranteed to run after the onSuccess and onFailure?
If I change that to an onComplete block is it guaranteed to run after the onSuccess and onFailure?
No, it's not. But the andThen
block is also not guaranteed to run after onSuccess
and onFailure
. The only thing that is guaranteed is that completion handlers added to the result of andThen
are executed after the closure given to andThen
.
That's also why it is not the same as defer
.
You could consider using onComplete
instead of onSuccess
and onFailure
, and switch on the result inside the closure and do the final tasks (e.g. fulfilling expectations) after the switch.
No, it's not. But the
andThen
block is also not guaranteed to run afteronSuccess
andonFailure
.
Ah, I was afraid of that. Interestingly enough, it hasn't appeared to cause an issue with my tests. I like how the code looks using the blocks as opposed to a switch statement, but to guarantee the effect I'm looking for I will make your suggested changes. Thanks for your help.