當前位置:
首頁 > 最新 > iOS 開發之block 和delegate

iOS 開發之block 和delegate

這裡是關於block和delegate的使用的一些討論。內容來自群:iOS編程藝術(群號:20002102)

閉包:可以捕獲外部變數的匿名函數

用block可以把發起回調前的局部變數捕獲住 如果處理回調的時候需要發起時的局部變數 用block很自然就可以實現 如果用notification或者observer的話,就需要專門去維護這些局部變數

block能夠抓取局部變數的特性是其它所有方式都無法做到的,符合這個特性的場景就是block的最佳使用場景。抓取局部變數的本質其實就是獲得相關變數的命名域,所以,在跨命名域調度的時候,由於命名域先天不完整,所以就不得不使用block作為載體去傳遞處理邏輯。典型的場景就是組件化時候的跨組件調用。

嗯,所以關鍵點就在於調用者和響應者之間命名域是否覆蓋完整。這也是objc.io那幅圖的缺陷,它並沒有涉及到這部分問題

雖然底層不知道上層,但是上層是知道底層的。如果是組件化場景,調用方不知道被調用方 被調用方也不知道調用方 那就非block不可 是的,主要就是利用了閉包能夠抓取上下文的特性。

你覺得網路庫用delegate比用block的優勢在哪? 調試過程你必須要找到著陸點 「找到著陸點」這一步如果用的是block,就很花成本了 著陸點統一的後果就是一個類裡面如果有好幾個apimanager requestSucceed裡面一堆if else 使用strategy模式的話,那就一個ifelse都沒有了 著陸點說的就是你請求放飛出去回來,接收的地方 block捕獲上下文的功能在網路庫這一層發揮不出優勢啊

這其實相當於:大家在進行帆船比賽,然後你的帆船不光能在海里開,還能當風箏在天上飛。但問題是:帆船比賽不需要你在天上飛啊。。。 block就是那個可以當風箏飛的帆船

你要說這個帆船可以當風箏,好不好?當然好,功能強大啊 但是在這個比賽場景裡面,體現不出優勢啊

因為block的隱式抓取局部變數,其本質是代碼對上下文的耦合。delegate由於顯式抓取,就能夠使得任意對象都可以脫離業務上下文來完成任務 這種場景下使用delegate的話就可以做到避免3000行viewcontroller的情況

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

IT行業需要更好的命名嗎?
Flask RESTful API 開發-基礎篇
NSA武器庫之eternalchampion復現
擬介科技:為什麼醫生做手術戴上 AR 眼鏡就像有了透視眼一樣?
Rust 妙用:增補標準庫和統一錯誤

TAG:推酷 |

您可能感興趣

Marvel Studios x adidas Basketball 全新聯名「Heroes Among Us」系列登場
Marvel Studios 發布 Avengers 版本「10YearChallenge」
Xcode 9—进阶的 iOS Simulator
Marvel Studios 正式發布《Spider-Man: Far From Home》電影標題 Logo
Xcode 9—進階的 iOS Simulator
結束beta:Windows Timeline功能正式登陸iOS版Edge瀏覽器
Midnight Studios x Converse Chuck 70 & One Star 官方發售詳情公開
Marvel Studios 總裁 Kevin Feige 確認將拍攝《Doctor Strange 2》
Marvel Studios《Avengers: Endgame》發布全新「To The End」預告短片
Facebook將關閉iOS市場研究應用程序Facebook Research
iOS 代碼使用 C+的zero-cost abstraction 特性
微軟正在iOS和Android上的Outlook中測試Cortana
Microsoft Studios改名為Xbox Game Studios
谷歌Advanced Protection Program現支持iOS應用
微軟計劃將Cortana集成到Outlook for iOS和Android
Facebook 開源其調試平台 Sonar,支持 Android 與 iOS
Blizzard 宣布《Diablo Immortal》即將登陸 iOS 及 Android 平台
Marvel Studios 總裁揭露《Avengers 4》及《Guardians 3》最新動態
iOS版Microsoft Edge Beta繼續優化 iPad布局更和諧
Environment:Sandbox——如何屏蔽 iOS的Bug 彈窗