2015-03-01 29 views
6

Tôi cần gọi 2 apis trong bộ điều khiển chế độ xem để tìm nạp dữ liệu từ máy chủ, tôi muốn chúng bắt đầu cùng một lúc, nhưng bước tiếp theo sẽ chỉ được kích hoạt nếu cả hai trả lại (không quan trọng đó là một thành công hay thất bại). Tôi có thể đưa ra 2 giải pháp: 1. Gắn chúng lại với nhau. Gọi api1, gọi api2 trong bộ xử lý kết quả của api1, chờ kết quả của api2 2. Đặt 2 biến chỉ báo Bool, tạo chức năng kiểm tra, nếu cả hai chỉ số này là đúng, hãy làm tiếp theo. Trong cả bộ xử lý kết quả của Apis, hãy đặt biến chỉ báo tương ứng, sau đó gọi hàm kiểm tra để quyết định xem có tốt hay không đểCách xử lý nhiều cuộc gọi mạng trong Alamofire

Đầu tiên không đủ, và tôi không thể nói giải pháp thứ hai là giải pháp thanh lịch. Liệu Alamofire có cái gì đó giống như kết hợp tín hiệu trong Reactivecocoa? Hoặc bất kỳ giải pháp tốt hơn?

+2

Như sau: http://commandshift.co.uk/blog/2014/03/19/using-dispatch-groups-to-wait-for-multiple-web-services/? – jrturton

+0

@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 –

Trả lời

8

Đá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.

+0

Có, tôi muốn loại bỏ chúng, nhưng khi bạn đặt chúng theo cách đó, nó trông đẹp hơn nhiều so với tôi nghĩ, tôi sẽ so sánh mã của bạn với dispatch_group, cảm ơn –

+0

Câu trả lời đáng yêu thanh lịch - cảm ơn vì điều này! – nicktones

+0

Các nhóm công văn có phải là một giải pháp tốt hơn hay chỉ một biến chỉ thị 'Bool' đơn giản dường như là cách duy nhất để làm việc? – Harish

Các vấn đề liên quan