用block做事件回調來簡化代碼,提高開發效率,block回調

來源:互聯網
上載者:User

用block做事件回調來簡化代碼,提高開發效率,block回調

   我們在自訂view的時候,通常要考慮view的封裝複用,所以如何把view的事件回調給Controller就是個需要好好考慮的問題,一般來說,可選的方式主要有target-action和delegate,以及這次要強烈推薦的block。     target-action和delegate方式有個很不方便的地方,就是配置代碼和action代碼不在同一個地方,你肯定要多寫一個selector方法或者delegate方法,這就帶來一個問題,一旦代碼比較長或者selector方法比較多,找起來就很不方便。把響應事件直接寫在配置的地方才是理想的選擇!而且實現這一理想選擇的方式,就是用block來做事件回調~     比如view上有個button,你需要把button的響應事件回調給controller,你應該怎麼做呢?最麻煩的方式應該是用delegate,你要給view定義delegate協議,在controller中實現這個方法,而寫了這麼多代碼,僅僅是為了響應button的事件(delegate方法還沒辦法跟設定view寫到一起),太不划算了; 能不能省了定義協議實現協議的步驟呢?能!用block就好了,給view添加一個block屬性來做回調,在配置view的時候把事件用block傳進去,然後設定button的相應事件就是去執行這個block,這樣配置代碼跟回調還能寫一起,貌似很不錯哦~~但是,給button添加一個事件,僅僅就是為了去執行一個block,這也是重複勞動啊;能不能把這步也最佳化了呢?能!直接用button的addTarget方法就行了嘛,addTarget方法不就是為了簡化這種情況的嘛~但是這樣又不能把配置代碼跟相應事件寫到一起了。。。能不能把這兩種方式結合一下呢? 能!用LXMBlockKit(https://github.com/Phelthas/LXMBlockKit)就可以了~LXMBlockKit 給UIButton封裝了一個 - (void)addButtonCallback:(UIButton *sender) 方法,讓button自己來做target,然後去響應事件,一舉兩得!!!不用敲重複的代碼,只用去設定回調就好了!!!

原來button事件的典型寫法:

[testButton addTarget:self action:@selector(handleButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; - (void)handleButtonTapped:(UIButton *)sender {        NSLog(@"handleButtonTapped");        }

使用Block的寫法:

   [testButton addButtonCallback:^(UIButton *sender) {        NSLog(@"handleButtonTapped");   }];
可以看出來還是省了很多代碼的,而且事件的回調就寫在button的配置處,不用來回找~~ 不過也有必須要注意的地方:block回調中,務必使用weakSelf!直接使用self必定會導致循環參考!!!block回調中,務必使用weakSelf!直接使用self必定會導致循環參考!!!block回調中,務必使用weakSelf!直接使用self必定會導致循環參考!!!重要的事情說三遍!!!view只要add到Controller上,就會被強引用,而block是被view強引用的,所以如果block中又引用了self,那就一定會循環參考。。。這個我找了N久也沒找到怎麼用代碼去判斷有沒有在block中引用self,所以沒辦法提示,只能靠自覺。。。沒辦法,養成好習慣吧 類似的實現方式還有UIBarButtonItem和UIGesture,都可以用這種方式大大簡化代碼~ NSNotificationCenter也可以用類似的方式,並且可以實現自動removeObserver,具體的實現方式稍有不同,主要是利用了屬性在對象釋放的時候會dealloc的原理,具體參考大神 nicklockwood的FXNotifications(https://github.com/nicklockwood/FXNotifications),我基本是按自己的代碼習慣重新敲了一遍。也可以參考facebook的KVOController(https://github.com/facebook/KVOController)或者大神zwaldowski的BlocksKit(https://github.com/zwaldowski/BlocksKit) 這個庫的主要目的是簡化自己平時常用的代碼,所以並沒有對各種事件各種控制項封裝的很完整,所以目前只有這幾個分類,其他的等以後用到再慢慢加~有什麼問題,歡迎討論~ 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.