設置AFNetworking請求操作 - 創建一個漏斗/瓶頸隊列單
我在我的程序兩個方面 - branch 1
和branch 2
- 去哪兒網請求在同一時間做出異步1併發GET請求,每個區。一次發送請求1次,因爲服務器對任何向服務器發出請求的用戶都有一個很小的幾毫秒的寬限期。一次運行1個併發請求的目的是幫助這個寬限期。
該操作已完成,因此如果在任何分支中有任何請求失敗 - 則有一個失敗保險,只需再次重複請求即可。
問題:
當我彼此分開地運行這些分支,即不同時,服務器是高興。但是,只要我允許兩個操作同時發生,服務器就會拋出一個429
錯誤,該錯誤是讓用戶知道there are too many requests coming in at any one time
的錯誤。然後會發生的是,有一半的請求失敗,然後由於失敗保護,請求將再次發送進行處理,直到它們全部完成。 代表用戶的數據包浪費時間和資源。
方案
Branch 1
發出10個請求(通常它的數千內,處理一次一個,但是爲了簡單起見,我們將保持在10)。 這10個請求將被同時處理1,並且一次很快地返回,並返回相應的數據對象。
現在,如果我們再次branch 1
操作運行 - 同時10個請求,然後添加branch 2's
10個請求,這將創造20個請求操作 - 的兩倍多 - OUT將服務器,這將導致大約一半的請求從兩個分支1和2失敗,隨着故障安全,然後踢入重新發送這些請求操作。號泣。
問題
有沒有辦法漏斗這些請求操作出來我的申請,無論在哪裏,這兩個分支我的應用程序內鋪設,使我們可以控制和瓶頸請求操作外出服務器以便服務器不會受到只有一半請求失敗的請求的轟炸?
可能的解決方法
我有一個想法是創建一個單,將作爲一個隊列以及瓶頸需要的,讓我能夠從任何分支內我的代碼庫的任意位置添加請求操作 - 因此,爲什麼我認爲單身人士會是一個好主意 - 然後一旦它意識到請求操作已被添加到隊列中,然後讓隊列同時運行1個併發請求。
我認爲這對我的工作很好,我只是不知道如何處理請求的完成塊,因爲從Branch 1
的請求操作與請求操作的完成塊Branch 2
不同。
您將如何管理?我們可以做些什麼嗎?
編輯1 - 目前我在做什麼
分支1 - 使用AFHTTPOperation:
1)對於每一個過程中,我創建一個for循環迭代10次加10 AFHTTPRequestOperation
s到稱爲multipleOperations的NSMutableArray
類型的本地數組。
2)I然後陣列添加multipleOperations到batchOfRequestOperations方法如下所示:
NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:muiltipleOperations
progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations){
//Do some stuff here for each iteration
}
completionBlock:^(NSArray*operations){
//Call the method that repeats this process again.
}];
3)I然後添加操作到mainQueue像這樣
[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO];
現在我不知道在分支1中的這個過程是否設置爲1 concurrenncy,不能看到它是:\
在分支2中使用NSURLSessionDataTa sk(剛剛意識到,如果他們都使用相同的子類,會不會更容易?笑
我注意到,我使用的是AFHTTPSessionManager
創建NSURLSessionDataTasks
..這犯規在for循環中運行,而是調用送出了自己的另一請求方法每次請求執行它自己完成的塊。因此,只要分支2中的前一個請求完成,它就會一直保持自己的調用狀態。這就是我知道它同時只運行一個請求的方式。所以這很好。
有沒有辦法讓這個更清潔?我使用HTTPRequestOperationManager
其中
無:(有人可以告訴我怎麼事情可以做正確?
謝謝。
既然你正在使用'AFNetworking',你不能只是設置'AFHttpRequestOperationManager'的基礎'NSOperationQueue'來使'maxConcurrentOperationCount'爲'1'嗎?這樣,它只會一次發送一個請求,而不管它來自哪個分支(當然,假設你正在使用'[AFHttpRequestOperationManager manager]'singleton)。 '[[AFHttpRequestOperationManager manager] operationQueue] .maxConcurrentOperationQueue = 1;' – 2014-11-01 20:06:36
是的,但是當你同時運行這些分支時他們不知道另一個分支正在運行,所以他們都會發送兩個併發操作 - 在同時,這導致一半的請求失敗,因爲服務器很高興接收來自一個分支的請求的速率。 這就是爲什麼我提出的場景,看看是否有一個方法適用於我的所有請求操作,無論哪個分支來自ALL隊列,然後讓最終隊列運行1個併發操作,也能夠處理完成塊 – Pavan 2014-11-01 21:03:51
您是否爲每個分支使用不同的AFHttpRequestOperationManager? – 2014-11-01 21:10:33