iOS-block的妙用:鏈式編程(經(jīng)典應(yīng)用:Masonry)

iOS開發(fā)當中有一個很特殊的存在,這個特殊就是block。在OC當中實現(xiàn)某一個功能都是一個響應(yīng)對象調(diào)用一個響應(yīng)方法捂寿,簡而言之就是Target-Action驳概。

以UIButton為例:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];

UIButton的事件就是一個響應(yīng)對象和一個響應(yīng)方法之間的一一映射稚照。

與UIButton這種不同咐熙,block則不一樣棋恼,其根本不需要響應(yīng)對象,如下:

    void (^LogString)(NSString *string) = ^(NSString *string) {
        NSLog(@"這是一個用來打印log的block,需要打印的字符串為:%@", string);
    };
    
    LogString(@"12345");

block的使用無非是以下三個步驟:

1.block的聲明。上述代碼中的void (^LogString)(NSString *string就是將void (^)(NSString *string)聲明成一個叫LogString的block
2.block的實現(xiàn)土陪。上述代碼中'='后面的便是block的實現(xiàn)鬼雀,包含了參數(shù)與返回值
3.block的調(diào)用励烦。上述代碼中的LogString(@"12345")就是對block的調(diào)用

今天小編就來說說block的另外一項應(yīng)用:鏈式編程

說到鏈式編程最經(jīng)典的應(yīng)用便是Masonry了,以下便是Masonry的簡單代碼:

    [self.nicknameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.leading.top.equalTo(view).priorityHigh();
    }];

其中可以看到對于make這個MASConstraintMaker對象的設(shè)置是以一系列的點語法來實現(xiàn)的域滥。

當然荆忍,這個leadingtop也是很容易實現(xiàn)的微宝,無非就是以系列的get方法而已。但是后面的equalTo(view)priorityHigh()是什么鬼?我們點進去:

Masonry源碼

這個時候可以看到equalTo方法的返回值是一個block玩徊,而equalTo里面則是一個block的聲明约啊,并且將這個block給return了

如此我們在調(diào)用equalTo(view)的時候經(jīng)歷了以下步驟:

1.調(diào)用equalTo方法的對象是MASConstraint佣赖,equalTo方法里面聲明了一個block和block的實現(xiàn)
2.MASConstraint對象調(diào)用equalTo方法實際上是返回了一個block恰矩,這個block的返回值還是MASConstraint對象
3.步驟2獲取到一個block,這個block參數(shù)是一個id類型的數(shù)據(jù)憎蛤,那么equalTo后面的view參數(shù)實際上就作為block的參數(shù)了外傅,這也就實現(xiàn)了一個block的調(diào)用
4.因為block的返回值是MASConstraint對象,所以經(jīng)歷步驟3之后的值實際上還是MASConstraint俩檬,調(diào)用priorityHigh()就又回到了步驟1

說來說去是不是繞糊涂了萎胰?實際上這無非就是block的聲明,block的實現(xiàn)與block的實現(xiàn)這三個步驟的另外一種變體棚辽。

接下來我們依據(jù)上面總結(jié)的Masonry的步驟來對UILabel實現(xiàn)鏈式編程:

1.聲明一個UILabel的分類技竟,如下:

UILabel的分類

2.初始化UILabel的方法聲明。在UILabel+Additions.h里聲明一個叫l(wèi)abel的方法屈藐,這個方法沒有參數(shù)榔组,返回值是一個block,這個block的返回值是一個UILabel對象联逻,block的參數(shù)是CGRect的結(jié)構(gòu)體搓扯。

/**
  * 初始化label,此方法是類方法且沒有參數(shù)
  * 此方法的返回值是一個block
  * 這個block參數(shù)為一個CGRect的參數(shù)
  * 返回值還是UILabel對象,用來實現(xiàn)鏈式編程
 */
+ (UILabel *(^)(CGRect frame))label;

3.初始化UILabel的方法實現(xiàn)包归。在UILabel+Additions.m實現(xiàn)label方法锨推,最主要是實現(xiàn)block,這個在block里實現(xiàn)UILabel的創(chuàng)建,并將這個block返回换可,如下:

+ (UILabel * _Nonnull (^)(CGRect))label {
    // 聲明并實現(xiàn)一個block椎椰,并返回
    return ^(CGRect frame) {
        // 根據(jù)傳過來的frame參數(shù)初始化UILabel,并返回
        return [[UILabel alloc] initWithFrame:frame];
    };
}

同理沾鳄,設(shè)置UILabel的text和textColor也是如此俭识,以下便是代碼:
UILabel+Additions.h進行方法的聲明:

// 對象方法
- (UILabel *(^)(NSString *title))title;
- (UILabel *(^)(UIColor *titleColor))titleColor;

UILabel+Additions.m對方法進行實現(xiàn):

- (UILabel * _Nonnull (^)(NSString * _Nonnull))title {
    return ^(NSString *title) {
        self.text = title;
        // 返回self就可以了
        return self;
    };
}

- (UILabel * _Nonnull (^)(UIColor * _Nonnull))titleColor {
    return ^(UIColor *titleColor) {
        self.textColor = titleColor;
        // 返回self就可以了
        return self;
    };
}

應(yīng)用代碼:

    UILabel *label = UILabel.label(CGRectMake(100, 100, 200, 50)).
                     title(@"鏈式編程的應(yīng)用").
                     titleColor([UIColor greenColor]);
    label.backgroundColor = [UIColor redColor];
    [self.view addSubview:label];

效果:


效果圖

最后打個廣告,個人第三方庫:
UDUserDefaultsModel:NSUserDefaults的改進方案
YIIFMDB:直接操作Model進行增刪改查洞渔,數(shù)學(xué)運算等套媚,且sql語句易于管理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市磁椒,隨后出現(xiàn)的幾起案子堤瘤,更是在濱河造成了極大的恐慌,老刑警劉巖浆熔,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件本辐,死亡現(xiàn)場離奇詭異,居然都是意外死亡医增,警方通過查閱死者的電腦和手機慎皱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叶骨,“玉大人茫多,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵景埃,是天一觀的道長。 經(jīng)常有香客問我今膊,道長,這世上最難降的妖魔是什么伞剑? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任斑唬,我火速辦了婚禮,結(jié)果婚禮上黎泣,老公的妹妹穿的比我還像新娘恕刘。我一直安慰自己,他們只是感情好聘裁,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布雪营。 她就那樣靜靜地躺著弓千,像睡著了一般衡便。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天镣陕,我揣著相機與錄音谴餐,去河邊找鬼。 笑死呆抑,一個胖子當著我的面吹牛岂嗓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鹊碍,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼厌殉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侈咕?” 一聲冷哼從身側(cè)響起公罕,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耀销,沒想到半個月后楼眷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡熊尉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年罐柳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狰住。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡张吉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出催植,到底是詐尸還是另有隱情芦拿,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布查邢,位于F島的核電站蔗崎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扰藕。R本人自食惡果不足惜缓苛,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邓深。 院中可真熱鬧未桥,春花似錦、人聲如沸芥备。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萌壳。三九已至亦镶,卻和暖如春日月,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缤骨。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工爱咬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绊起。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓精拟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虱歪。 傳聞我的和親對象是個殘疾皇子蜂绎,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容