Đánh giá của bạn chính xác 100%. Tại thời điểm này, hai lựa chọn bạn đặt ra thực sự là cách tiếp cận duy nhất có thể. Tôi đồng ý với bạn rằng tùy chọn thứ hai của bạn tốt hơn nhiều so với tùy chọn đầu tiên của bạn.
Nếu bạn muốn kết hợp ReactiveCocoa với Alamofire, thì điều đó chắc chắn có thể, nhưng chưa thực hiện được với kiến thức của tôi. Bạn cũng có thể điều tra xem PromiseKit có thể cung cấp một số hỗ trợ, nhưng nó chưa được dán cùng với Alamofire. Việc cố gắng kết hợp một trong các thư viện này với các serializers phản ứng của Alamofire sẽ không phải là một nhiệm vụ tầm thường bằng bất kỳ phương tiện nào.
Chuyển đổi bánh răng một chút, tôi thực sự không nghĩ ReactiveCocoa hoặc PromiseKit rất phù hợp cho trường hợp sử dụng của bạn vì bạn không gọi các cuộc gọi dịch vụ, bạn đang chạy chúng song song. Ngoài ra, bạn vẫn cần phải chạy tất cả các phân tích cú pháp của bạn và xác định xem mỗi người đã thành công hay thất bại và sau đó cập nhật ứng dụng của bạn cho phù hợp. Những gì tôi nhận được là Option 2 sẽ là đặt cược tốt nhất của bạn cho đến nay trừ khi bạn muốn đi đến tất cả các nỗ lực của việc kết hợp PromiseKit hoặc ReactiveCocoa với serializers phản ứng của Alamofire.
Đây là những gì tôi muốn đề nghị giữ mọi thứ ít phức tạp hơn.
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 {
// Handle the fact that you're finished
}
}
}
Việc triển khai thực sự rõ ràng và đơn giản. Trong khi tôi hiểu mong muốn của bạn để loại bỏ các cờ hoàn thành và chức năng gọi lại, các tùy chọn khác như ReactiveCocoa và/hoặc PromiseKit vẫn sẽ có logic bổ sung là tốt và có thể sẽ làm mọi thứ trở nên phức tạp hơn.
Một lựa chọn khác có thể là sử dụng các nhóm công văn và semaphores, nhưng điều đó thực sự làm tăng độ phức tạp, nhưng có thể giúp bạn gần gũi hơn với cách tiếp cận ReactiveCocoa hoặc PromiseKit.
Tôi hy vọng điều này sẽ giúp tiết kiệm ánh sáng.
Như sau: http://commandshift.co.uk/blog/2014/03/19/using-dispatch-groups-to-wait-for-multiple-web-services/? – jrturton
@jrturton nó rất hữu ích, tôi quyết định sử dụng nhóm công văn để giải quyết điều này –