Your rating is 100% correct. At the moment, the two options that you have posted are really the only possible approaches. I agree with you that your second option is much better than the first of your use cases.
If you want to combine ReactiveCocoa with Alamofire, then this is certainly possible, but not yet done, as far as I know. You can also investigate if PromiseKit can provide some help, but it has not yet been glued together with Alamofire. Trying to combine any of these libraries with Alamofire answer serializers will not be any trivial task.
Shifting gears a bit, I really don't think ReactiveCocoa or PromiseKit is very good for your use case, since you are not binding service calls, you are running them in parallel. In addition, you still need to run all the parsing logic and determine whether it succeeded or failed, and then update the application. What I get is that option 2 would be your best bet if you don't want to go out of your way to combine PromiseKit or ReactiveCocoa with Alamofire answer serializers.
Here's what I would suggest making things less complicated.
import Foundation import Alamofire class ParallelServiceCaller { var firstServiceCallComplete = false var secondServiceCallComplete = false func startServiceCalls() { let firstRequest = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["first": "request"]) firstRequest.responseString { request, response, dataString, error in self.firstServiceCallComplete = true self.handleServiceCallCompletion() } let secondRequest = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["second": "request"]) secondRequest.responseString { request, response, dataString, error in self.secondServiceCallComplete = true self.handleServiceCallCompletion() } } private func handleServiceCallCompletion() { if self.firstServiceCallComplete && self.secondServiceCallComplete {
The implementation is really clean and easy to use. Although I understand your desire to get rid of completion flags and callback functions, other parameters, such as ReactiveCocoa and / or PromiseKit, will still have additional logic and may ultimately complicate the situation.
Another possible option is to use send groups and semaphores, but this does add complexity, but may come close to the ReactiveCocoa or PromiseKit approach.
I hope this helps shed some light.