最近一直在思考并持續的擴充著自己的技術棧,比如每天堅持著學習前端知識,并且時常想著在移動端這條路上,自己的技術盲區。誠然,想要在一個領域達到一定的技術高度是挺困難的一件事情,操之過急萬萬不可,最主要的還是保持對技術的熱情,慢慢沉淀。
以前的公司并不需要高強度的加班,所以時長有時間去發掘一些新鮮玩意兒,圈內有了技術熱潮,也能及時跟進觀望或者學習,但是最近在一波高強度加班過后,這種業務代碼與自身學習之間的沖突也讓我產生了一些自己的看法。一個程序員,不論何時,不能拋掉持續學習的習慣。
最近的大面積寫業務代碼,當碰到兩個類之間的傳值問題,我習慣性的解決方案是使用delegate
,我覺得delegate
本身當命名得當并且功能單一時,可閱讀性會比較好。在習慣了這種思維后,開發中也養成了自己的習慣。
但是在最近封裝代碼的時候,我發覺delegate
對于我自己定義并編寫代碼來說,可讀性和使用性很好,但是當他人來使用我封裝的代碼的時候,也許Block
更容易被理解一點。舉個簡單的例子,就比如
[UIView animateWithDuration:1 animations:^{
//do something
}];
這是我們日常最常用的Block
結構之一,需要執行的事情,只要在Block
中交代清楚就可以了,在閱讀他人的代碼時,可以直接在Block
中直接閱讀到執行的事件,并不用再去關注各種delegate
中執行了什么。大大提高了代碼的可讀性。
我認為,程序員首先是寫人能看得懂的代碼,順便運行。
在這個理念的驅使下,我大概會在之后的開發過程中,對可讀性這個概念更上心一點,能用block
處理的事件,盡量的用block
處理。很久以前我寫過一篇博客,講述的是blcok
的傳值,iOS4.0開始,蘋果爸爸引入了block
的特性,而自從block
特性誕生之日起,似乎它就受到了蘋果爸爸特殊的照顧和青睞。字面上說,block
就是一個代碼塊,但是它的神奇之處在于在內聯(inline)執行的時候(這和C++很像)還可以傳遞參數。同時block本身也可以被作為參數在方法和函數間傳遞,這就給予了block
無限的可能。
在日常的coding
里絕大時間里開發者會是各種block
的使用者,但是當你需要構建一些比較基礎的,提供給別人用的類的時候,使用block
會給別人的使用帶來很多便利。當然如果你已經厭煩了一直使用delegate
模式來編程的話,偶爾轉轉寫一些block
,不僅可以鍛煉思維,也能讓你寫的代碼看起來高端洋氣一些,而且因為代碼跳轉變少,所以可讀性也會增加。
今天我用一個判斷奇數偶數的例子,來說說如何在封裝的方法中,根據條件來執行方法內攜帶的block
。
首先看看我們這個含有blcok
的類是如何聲明的。
typedef void (^LixExcuteOperation)(NSInteger);
typedef void(^LixError)(void);
@interface LixBlock : NSObject
- (void)isOddNumber:(NSInteger)number Excute:(LixExcuteOperation)excute Lixerror:(LixError)error;
@end
結合下面的圖片,來看看block
是如何聲明并且定義的。
再來看看這個方法的內部,是如何使用block
的,因為是示例,所以我很粗略的去判斷了奇偶數,并沒有考慮特殊情況,見諒,只是個栗子。
- (void)isOddNumber:(NSInteger)number Excute:(LixExcuteOperation)excute Lixerror:(LixError)error {
BOOL isOddNum = number % 2 == 0 ? NO : YES;
if (isOddNum && excute) {
excute(number);
}
if (!isOddNum && error) {
error();
}
}
至于調用,就更加隨意了。
LixBlock *block = [[LixBlock alloc] init];
[block isOddNumber:9 Excute:^(NSInteger number) {
NSLog(@"is OddNumber %ld", number);
} Lixerror:^{
NSLog(@"is not OddNumber");
}];
至此,一個簡單的封裝block
進方法的栗子就已經講完了。舉一反三的講,我們在對網絡請求進行二次封裝,執行success
或者error
狀態的閉包時,就可以用到類似的思想了。代碼的可讀性是否如愿提升了呢。
簡單的栗子講到這里,Coding
還是需要多寫多思考的。