最近項目中出現(xiàn)一個需求.就是有可能要對成百甚至上千條數(shù)據(jù)進(jìn)行修改. 但是服務(wù)器那邊不愿意提供批量操作的接口. 只能自己實現(xiàn)了. 首先感謝AFNetworking. 因為他.我才能方便的實現(xiàn)這個需求.
先說思路吧. 手機的內(nèi)存是有限的, 我們?nèi)绻活櫤蠊?一次性創(chuàng)建大量的請求發(fā)出, 這絕對是會影響性能的. 所以我們要限制請求的最大并發(fā)數(shù),同一時間最多只能發(fā)送5個或者10個的請求, 某個請求完成了,就繼續(xù)發(fā)送下個請求.
直接上代碼.先是.h.
首先我們來看看代碼:
name是該工具的名字. 方便在接下來的使用.
代理的作用是當(dāng)全部任務(wù)執(zhí)行完畢的時候告訴外面.
參數(shù)數(shù)組是用于發(fā)送請求的,可以在創(chuàng)建這個類的時候賦值,或者在之后賦值.
接下來是一個bool.該值決定是否要繼續(xù)執(zhí)行任務(wù).
最后是一個開始任務(wù)的方法,通過block執(zhí)行回調(diào).
然后是.m:
這里有個manager屬性.是用于發(fā)送請求的.
然后就是在創(chuàng)建對象的時候調(diào)用一個baseSetUp方法,對manager初始化.
接下來就是具體發(fā)送請求的方法:
首先判斷是否被cancel了. 是的話.就直接調(diào)用代理方法
然后再判斷參數(shù)數(shù)組的個數(shù)是否為0, 如果不是的話,就取出數(shù)組的第一個參數(shù), 使用manager發(fā)出, 在成功或者失敗的回調(diào)里面, 先把參數(shù)從數(shù)組中移除, 然后通過自身的block把參數(shù)告訴外面. 再繼續(xù)調(diào)用這個方法.
直到最后請求數(shù)組已經(jīng)為空了. 就調(diào)用代理方法告訴外界所有任務(wù)都已經(jīng)處理完畢了.
這就是這個工具類的全部了. 但是這個工具也只是實現(xiàn)了同一時間發(fā)送一個請求. 請求回來后,無論成功與否,都繼續(xù)發(fā)送下個請求. 與并發(fā)請求還差著十萬八千里呢.
所以我們需要創(chuàng)建一個管理類, 專門管理多個工具.有10個工具,我們就能同時發(fā)送10個請求了.
先是.h文件:
屬性的話只有兩個,一個是最大并發(fā)數(shù),一個是代理.
然后是創(chuàng)建方法, 還有開始任務(wù),以及取消任務(wù)的方法.
代理的話,就是成功,失敗,以及所有任務(wù)完畢后的回調(diào).
然后是.m文件:
屬性的話也只有兩個. 一個是用于保存工具的數(shù)組,一個是已完成任務(wù)的個數(shù).
然后是方法, 重寫了最大并發(fā)數(shù)的set方法.
然后是開始任務(wù)的時候,需要給工具派發(fā)任務(wù). 派發(fā)任務(wù)是把請求的個數(shù)平分. 當(dāng)然,最后一個工具的任務(wù)不一定平均數(shù),需要特殊處理.
派發(fā)完畢之后,就遍歷工具數(shù)組, 依次發(fā)起請求.我們再通過回調(diào)告訴外界.
然后是取消任務(wù)的方法,也是遍歷,設(shè)置工具的cacel屬性為yes就可以了.
最后.當(dāng)某個工具任務(wù)執(zhí)行完畢后,就會調(diào)用工具的完成任務(wù)的回調(diào)方法. 在這里,我們做個判斷. 當(dāng)全部執(zhí)行完畢后, 再告訴外界就可以了.
github上demo的地址:https://github.com/byljbdh/ALNMultipleNetworkTool
以上.