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

再來看看這個方法的內(nèi)部,是如何使用block的,因為是示例,所以我很粗略的去判斷了奇偶數(shù),并沒有考慮特殊情況,見諒,只是個栗子。
- (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();
}
}
至于調(diào)用,就更加隨意了。
LixBlock *block = [[LixBlock alloc] init];
[block isOddNumber:9 Excute:^(NSInteger number) {
NSLog(@"is OddNumber %ld", number);
} Lixerror:^{
NSLog(@"is not OddNumber");
}];
至此,一個簡單的封裝block進方法的栗子就已經(jīng)講完了。舉一反三的講,我們在對網(wǎng)絡請求進行二次封裝,執(zhí)行success或者error狀態(tài)的閉包時,就可以用到類似的思想了。代碼的可讀性是否如愿提升了呢。
簡單的栗子講到這里,Coding還是需要多寫多思考的。