iOS開發之巧用Block和代理方法結合來傳值


好久沒寫技術博客了,因為996的工作周期已經持續好幾個月了。每天晚上回家都沒有太多精力學習很多其他的東西,而且很多時候是接着完善工作的項目的模塊開發。所以博客停歇了這么久,更新率也低了不少,今天補充一篇關於我巧用block傳值的技術總結。

 

需求:在一個輸入框,輸入幾個關鍵字,彈出搜索的關鍵字列表。

備注:通過關鍵字得到的完整的關鍵字列表的數據是通過網絡請求后台返回的數據。

效果:

    

交互邏輯過程分析:

  這個搜索關鍵字的帶輸入框的控制器中,輸入關鍵字"河南",然后將這個關鍵詞作為網絡請求的參數,請求關鍵詞列表,也就是獲取了搜索結果的數組,然后根據這個數組彈出UITableView展示數據,然后接着再輸入關鍵詞"理工",也就自然和前面拼接成"河南理工",又是將這個關鍵詞進行網絡請求,獲得搜索結果數組,同樣通過UITableView展示數據。很顯然,包含河南理工四個字的結果也就只有"河南理工大學"了。

 

當然,這個"交互邏輯過程的分析"僅僅是一個業務邏輯過程的分析,但凡有點移動前端的開發經驗的程序猿肯定能想到,在這個控制器的Textfield的監聽方法里邊添加搜索學校關鍵詞的網絡請求,然后在請求成功的block回調用,顯示UITableView,加載搜索結果的數據數組

 

但是這里,我還有一個進一步的需求,那就是這個帶輸入框的控制器在整個項目中,有很多地方公用,我要提高這個功能的復用性。比如搜索模塊的搜索公司關鍵字,輸入"廣州",所有的"廣州...有限公司"數據列表展示出來。如果按照前面的基本思路"在這個控制器的Textfield的監聽方法里邊添加搜索學校關鍵詞的網絡請求,然后在請求成功的block回調用,顯示UITableView,加載搜索結果的數據數組",那么搜索公司關鍵字,也要在這個Textfield的監聽方法里面添加搜索關鍵字的網絡請求?這樣根本就沒起到軟件開發"高內聚,低耦合"的作用。所以進一步的需要思考的就是,能否將這個網絡請求公開在外部被調用,我只要求回傳的是關鍵詞數組就行,比如外部網絡請求學校關鍵詞數組,就傳入學校關鍵詞數組,然后通過TableView展示,外部網絡請求公司關鍵詞數組,就傳入公司關鍵詞數組,然后通過UITableView展示。也就是說,我這個帶輸入框的控制器只做搜索結果數組的數據展示的職責,網絡請求的過程不屬於這個功能模塊的職責。<業務邏輯的職責抽離,實現解耦>

 

首先,我們基本知道,搜索結果的數組需要從外部傳入,在這里也就是跳轉控制器的前面一個控制器傳入。這里就需要一個代理方法執行被回調傳入,然后在這個代理方法實現的邏輯執行網絡請求,但是這時候還有一個問題,那就是網絡請求會有時間延遲,如果僅僅通過回調代理方法直接返回結果是不行的,因為代理方法的執行是不會延遲的,也就是直接被回調,然后直接返回,這是代碼語言的本性,開發久了並且熟練代理方法和block回傳的自然就會有所體會,所以這里網絡請求block回傳(比如你可能用的是AFN網絡請求接口,成功之后block會返回data具體的數據),就不能通過代理方法中的return直接返回了,而是在代理方法再添加一個block再一次回傳網絡請求block回傳的數據。代碼如下:

回到帶輸入框的展示關鍵詞列表控制器的內部:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM