很久沒寫技術博客了,由於996的工做週期已經持續好幾個月了。天天晚上回家都沒有太多精力學習不少其餘的東西,並且不少時候是接着完善工做的項目的模塊開發。因此博客停歇了這麼久,更新率也低了很多,今天補充一篇關於我巧用block傳值的技術總結。前端
需求:在一個輸入框,輸入幾個關鍵字,彈出搜索的關鍵字列表。數組
備註:經過關鍵字獲得的完整的關鍵字列表的數據是經過網絡請求後臺返回的數據。網絡
效果:學習
交互邏輯過程分析:spa
這個搜索關鍵字的帶輸入框的控制器中,輸入關鍵字"河南",而後將這個關鍵詞做爲網絡請求的參數,請求關鍵詞列表,也就是獲取了搜索結果的數組,而後根據這個數組彈出UITableView展現數據,而後接着再輸入關鍵詞"理工",也就天然和前面拼接成"河南理工",又是將這個關鍵詞進行網絡請求,得到搜索結果數組,一樣經過UITableView展現數據。很顯然,包含河南理工四個字的結果也就只有"河南理工大學"了。代理
固然,這個"交互邏輯過程的分析"僅僅是一個業務邏輯過程的分析,但凡是有點移動前端的開發經驗的程序猿確定能想到,在這個控制器的Textfield的監聽方法裏邊添加搜索學校關鍵詞的網絡請求,而後在請求成功的block回調用,顯示UITableView,加載搜索結果的數據數組。blog
可是這裏,我還有一個進一步的需求,那就是這個帶輸入框的控制器在整個項目中,有不少地方公用,我要提升這個功能的複用性。好比搜索模塊的搜索公司關鍵字,輸入"廣州",全部的"廣州...有限公司"數據列表展現出來。若是按照前面的基本思路"在這個控制器的Textfield的監聽方法裏邊添加搜索學校關鍵詞的網絡請求,而後在請求成功的block回調用,顯示UITableView,加載搜索結果的數據數組",那麼搜索公司關鍵字,也要在這個Textfield的監聽方法裏面添加搜索關鍵字的網絡請求?這樣根本就沒起到軟件開發"高內聚,低耦合"的做用。因此進一步的須要思考的就是,可否將這個網絡請求公開在外部被調用,我只要求回傳的是關鍵詞數組就行,好比外部網絡請求學校關鍵詞數組,就傳入學校關鍵詞數組,而後經過TableView展現,外部網絡請求公司關鍵詞數組,就傳入公司關鍵詞數組,而後經過UITableView展現。也就是說,我這個帶輸入框的控制器只作搜索結果數組的數據展現的職責,網絡請求的過程不屬於這個功能模塊的職責。<業務邏輯的職責抽離,實現解耦>接口
首先,咱們基本知道,搜索結果的數組須要從外部傳入,在這裏也就是跳轉控制器的前面一個控制器傳入。這裏就須要一個代理方法執行被回調傳入,而後在這個代理方法實現的邏輯執行網絡請求,可是這時候還有一個問題,那就是網絡請求會有時間延遲,若是僅僅經過回調代理方法直接返回結果是不行的,由於代理方法的執行是不會延遲的,也就是直接被回調,而後直接返回,這是代碼語言的本性,開發久了而且熟練代理方法和block回傳的天然就會有所體會,因此這裏網絡請求block回傳(好比你可能用的是AFN網絡請求接口,成功以後block會返回data具體的數據),就不能經過代理方法中的return直接返回了,而是在代理方法再添加一個block再一次回傳網絡請求block回傳的數據。代碼以下:開發
回到帶輸入框的展現關鍵詞列表控制器的內部:博客