2016-01-21 60 views
3

我需要按順序執行請求,但這不適用於Alamofire。Alamofire Serial Requests

我希望按順序打印1〜30(假定該響應是隻爲參數的回波)

// Only 1 connection per Host 

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
configuration.HTTPMaximumConnectionsPerHost = 1 
configuration.timeoutIntervalForRequest = 30 
self.manager = Alamofire.Manager(configuration: configuration) 

for i in 1...30 { 
    manager.request(.GET, "http://httpbin.org/get", "i" : i], encoding: .JSON) 
     .responseJSON { response in 
      switch (response.result){ 
      case .Failure(let error): 
       print("error") 
       break; 
      case .Success(let json): 
       print(json) 
      } 
    }) 
+1

你表達了你的期望,但不是你的結果。如果你沒有看到1 ... 30你看到了什麼,你認爲這意味着什麼是錯誤的? – Jonah

+0

@Jonah,我看到數字1到30,但沒有訂購 –

回答

5

作爲每NSURLSessionConfiguration的文檔:

此屬性確定由任務基於該配置會話內的每個主機同時連接的最大數目。

此限制是每個會話,所以如果您使用多個會話,則您的應用作爲整體可能會超出此限制。此外,根據您與Internet的連接,會話可能會使用比您指定的更低的限制。

OS X中的默認值爲6,或iOS中爲4。

如您所見,此設置僅控制網絡級別的連接數量。一旦您使用NSURLSession(這是Alamofire的基礎)排列了一些請求,則需要您確定何時提出請求。使用NSURLSession或Alamofire無法保證請求的順序,而無需以這種方式對其進行明確編碼。

也就是說,通過將請求包裝在NSOperation中,您可能能夠獲得所需的行爲。如果您使用.maxConcurrentOperationCount1創建NSOperationQueue,則您實際上會創建一個串行隊列。然後使用你已經寫了相同的循環,你應該能夠來包裝你Alamofire的要求是這樣的:

queue.addOperationWithBlock { 
    manager.request(.GET, "http://httpbin.org/get", "i" : i], encoding: .JSON) 
     .responseJSON { response in 
      switch (response.result){ 
      case .Failure(let error): 
       print("error") 
       break; 
      case .Success(let json): 
       print(json) 
      } 
    }) 
} 

憑藉的.maxConcurrentOperationCount1,隊列順序應該採取行動,正如我所說。因此,按照NSOperationQueue的文檔,您的操作將按照它們添加到隊列中的順序執行。所以你應該看到你想要的1到30個結果。

所有這一切說,有可能有一個更好的解決方案,你想解決的問題,除非這只是一個編碼練習,以獲得這些結果。

+0

謝謝!,是的,我不明白爲什麼請求沒有按順序執行。 –

0

作爲上Alamofire's Github page指出:

網絡中Alamofire是異步完成。異步編程可能會讓不熟悉該概念的程序員感到沮喪,但有這樣做的very good reasons

因此,通過使用Alamofire的本質,您將獲得異步網絡調用。你可以選擇一個不同的庫或使用基本的SDK實現,但是從Alamofire的Github頁面的Apple文檔鏈接中可以看到,你會發現幾乎每個網絡庫都是異步的。

因此,爲了讓你的Alamofire界面能夠同步接收你的呼叫,但是過去,不能保證響應會以什麼順序回覆給你。他們可能會以不同的方式提出他們的請求順序,他們幾乎肯定會以不同的順序返回響應。

這裏的一個更好的選擇是存儲一個可變數組的響應,一旦它有響應存儲從每個網絡調用你,排序數組,然後做你的打印。

+1

是的,我知道Alamofire是Async和異步編程的所有好處。所有其他來自App的請求都以這種方式。事實上,我已經找到了解決我的問題的解決方法。真正的問題這裏是:「HTTPMaximumConnectionsPerHost = 1」爲什麼沒有按預期工作?或者'HTTPMaximumConnectionsPerHost'屬性的真正含義是什麼?對不起,如果問題不是很\t明確 –