編程思想-iOS鏈?zhǔn)叫胨痢⒑瘮?shù)式和響應(yīng)式編程

在了解鏈?zhǔn)侥淠恕⒑瘮?shù)式和響應(yīng)式編程前,我們需要回顧下Block豌汇,它在下面的編程中起著核心作用幢炸。

Block

block表達(dá)式語法:
^返回值類型(參數(shù)列表){表達(dá)式}

例如:
^int (int count) {
  return count + 1;
};
聲明類型變量的語法
返回值類型(^變量名)(參數(shù)列表) = block表達(dá)式

例如:
int (^sum)(int count) = (^int count) {
  return count + 1;
};
作為函數(shù)參數(shù)的語法
- (void)func(int (^)(int))block {

}

定義block簡寫
typedef int (^Sumblock)(int);

- (void)func(Sumblock)block {

}

作為返回值的語法,相當(dāng)于get方法,不允許帶參數(shù)
- (int (^)(int))func {

   return ^(int count) {

      return count ++;
    };
}

定義block簡寫
typedef int (^Sumblock)(int);
- (Sumblock)func {  
  
  return ^(int count) {

    return count ++;
  };
}
總結(jié)
  • block作為對象的屬性
  • block 作為方法的參數(shù)
  • block作為返回值>芗M鸹病!(擴(kuò)展性非常強(qiáng)逻澳,今天的主角)

鏈?zhǔn)骄幊?/h4>

鏈?zhǔn)骄幊趟枷胩攸c:方法的返回值必須是方法的調(diào)用者

下面是我們的普通的寫法


@interface Person : NSObject

- (void)eat;
- (void)sleep;

@end

@implementation Person

- (void)eat
{
    NSLog(@"%s", __FUNCTION__);
}

- (void)sleep
{
    NSLog(@"%s", __FUNCTION__);
}

@end

ViewController.m
Person *person = [[Person alloc] init];
調(diào)用時必須單個調(diào)用闸天,而且不能任意組合順序
  /** 普通的調(diào)用方式  */
    [person eat];
    [person sleep];

鏈?zhǔn)綄懛?方法增加一個返回值,且返回值為調(diào)用者本身

// 鏈?zhǔn)綄懛?Person.h
- (Person *)eat;
- (Person *)sleep;

Person.m
- (Person *)eat
{
    NSLog(@"%s", __FUNCTION__);
    return self;
}

- (Person *)sleep
{
    NSLog(@"%s", __FUNCTION__);
    return self;
}

ViewController.m
    Person *person = [[Person alloc] init];
  /** 鏈?zhǔn)綄懛?這樣不僅可以無限調(diào)用斜做,而且可以控制順序 */
    [[person eat] sleep];
    [[person sleep] eat];
    [[person eat] eat];

    /** 通過”點”語法苞氮,將需要執(zhí)行的代碼塊連續(xù)的書寫下去,就是鏈?zhǔn)骄幊?它能使代碼簡單易讀,書寫方便 */
    person.eat.sleep.eat.sleep.sleep;

鏈?zhǔn)骄幊處?shù)的寫法:將block作為返回值

Person.h
- (Person *(^)(NSString *food))eat3;
- (Person *(^)(NSString *where))sleep3;

Person.m
- (Person *(^)(NSString *food))eat3
{
    return ^(NSString *food) {
        
        NSLog(@"吃:%@ ",food);
        
        return self;
    };
}

- (Person *(^)(NSString *where))sleep3
{
    return ^(NSString *where) {
        
        NSLog(@"睡在:%@上",where);
        
        return self;
    };
}

ViewController.m
    Person *person = [[Person alloc] init];

    /** 鏈?zhǔn)?+ 函數(shù)式寫法 */
    person.sleep3(@"床").eat3(@"蘋果").eat3(@"香蕉").sleep3(@"沙發(fā)");

    返回值block不帶參數(shù)瓤逼,()不傳參即可
    person.sleep3().eat3().eat3().sleep3();

函數(shù)式編程

函數(shù)式編程思想:是將操作盡可能寫在一起!嵌套的函數(shù)!!
本質(zhì):就是往方法里面?zhèn)魅隑lock,方法中嵌套Block調(diào)用.

Person.h
@property (nonatomic, assign) NSInteger result;
- (Person *)calculator:(NSInteger(^)(NSInteger result))block;

Person.m
/** 返回調(diào)用者本身笼吟,獲取其它屬性和方法 */
- (Person *)calculator:(NSInteger(^)(NSInteger result))block
{
    _result = block(_result);
    
    return self;
}

ViewController.m
   Person *person = [[Person alloc] init];
/** 計算器 */
   Person *calculatPerson = [person calculator:^NSInteger(NSInteger result) {
       
        result = result + 10;
        result = result*10;
        return result;
    }];
    
    NSLog(@"%ld", calculatPerson.result);

函數(shù)+鏈?zhǔn)骄幊?/h4>

若將函數(shù)和鏈?zhǔn)骄幊探Y(jié)合,我們的程序?qū)l(fā)出藝術(shù)的火花
典型案例:Masonry界面布局框架

   //創(chuàng)建一個View
    UIView * redView = [[UIView alloc]init];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    //鏈?zhǔn)骄幊趟枷胩攸c:方法返回值必須要有方法調(diào)用者!!
    
    //添加約束  --  make約束制造者!!
    [redView mas_makeConstraints:^(MASConstraintMaker *make) {
        //設(shè)置約束 每次調(diào)用left\top就是將約束添加到數(shù)組中!
        /*
         MASConstraint * (^block)(id)  = make.left.top.equalTo;
         MASConstraint * mk = block(@10);
         mk.top;
        */
        make.left.top.equalTo(@10);
        
        make.right.bottom.equalTo(@-10);
        /**
            mas_makeConstraints執(zhí)行流程:
            1.創(chuàng)建約束制造者M(jìn)ASConstraintMaker,并且綁定控件,生成一個保存所有約束的數(shù)組
            2.執(zhí)行mas_makeConstraints傳入的Block
            3.讓約束制造者安裝約束!
                * 1.清空之前的所有約束
                * 2.遍歷約束數(shù)組,一個一個安裝
         */
        
    }];

我們可以模仿Masonry 寫一個簡單的加法計算器

addCalculator.h
@property (nonatomic, assign) NSInteger sumresult;
- (addCalculator * (^)(NSInteger sumresult))add;

addCalculator.m
- (addCalculator * (^)(NSInteger sumresult))add
{
    return ^(NSInteger sumresult) {
      
        _sumresult += sumresult;
        
        return self;
    };
}

Person.h
// 函數(shù)鏈?zhǔn)骄幊?@property (nonatomic, assign) NSInteger result;
- (Person *)makecalculator:(void (^)(addCalculator *addcalculator))block;

Person.m
- (Person *)makecalculator:(void (^)(addCalculator *addcalculator))block
{
    addCalculator *add = [[addCalculator alloc] init];
    if (block) {
        block(add);
    }
    
    self.result = add.sumresult;
    return self;
}

    /** 函數(shù)鏈?zhǔn)骄幊?*/
ViewController.m
    Person *person = [[Person alloc] init];
    [person makecalculator:^(addCalculator *addcalculator) {
       
        addcalculator.add(10).add(30);
    }];
    
    NSLog(@"person : %ld", person.result);

響應(yīng)式編程

解釋:在程序開發(fā)中:a = b + c賦值之后 b 或者 c 的值變化后抛姑,a 的值不會跟著變化赞厕;
響應(yīng)式編程目標(biāo)就是,如果 b 或者 c 的數(shù)值發(fā)生變化定硝,a 的數(shù)值會同時發(fā)生變化皿桑;
響應(yīng)編程的經(jīng)典案例:KVO
響應(yīng)式編程框架:ReactiveCocoa(RAC)
RAC學(xué)習(xí)可參考SkyHarute 簡書博客

源碼下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诲侮,更是在濱河造成了極大的恐慌镀虐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沟绪,死亡現(xiàn)場離奇詭異刮便,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绽慈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門恨旱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坝疼,你說我怎么就攤上這事搜贤。” “怎么了钝凶?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵仪芒,是天一觀的道長。 經(jīng)常有香客問我耕陷,道長掂名,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任哟沫,我火速辦了婚禮饺蔑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗜诀。我一直安慰自己膀钠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布裹虫。 她就那樣靜靜地躺著,像睡著了一般融击。 火紅的嫁衣襯著肌膚如雪筑公。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天尊浪,我揣著相機(jī)與錄音匣屡,去河邊找鬼。 笑死拇涤,一個胖子當(dāng)著我的面吹牛捣作,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鹅士,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼券躁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起也拜,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤以舒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后慢哈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔓钟,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年卵贱,在試婚紗的時候發(fā)現(xiàn)自己被綠了滥沫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡键俱,死狀恐怖兰绣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情方妖,我是刑警寧澤狭魂,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站党觅,受9級特大地震影響雌澄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杯瞻,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一镐牺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魁莉,春花似錦睬涧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至检疫,卻和暖如春讶请,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屎媳。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工夺溢, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烛谊。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓风响,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丹禀。 傳聞我的和親對象是個殘疾皇子状勤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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