iOS中的函數響應式編程思想

1、前言

最近正在學習iOS底層框架,在學習RxSwift的課程時,涉及到了函數響應式編程的思想,這讓我想起了在工做項目中使用到的ReactiveCocoa第三方庫,它裏面也使用了函數響應式編程思想,以前只是看了簡單的介紹,並會使用它而已,如今必須完全去掌握該思想--函數響應式編程(FRP(Functional Reactive Programming)),下面就讓咱們一塊兒揭開函數響應式編程思想的神祕面紗。html

2、基本概念

在iOS開發中,有三種編程思想,分別是鏈式編程、函數式編程和響應式編程。react

一、鏈式編程

  • 定義:它是能夠經過「點」語法,進行調用所執行的函數或代碼塊,並能夠連續的使用。
  • 特色:方法必須有返回值,而且該值是對象自己;返回值的形式能夠是Block塊(返回值必須是對象自己,也可帶參數)也能夠是對象自己。
  • 舉例: YLGPerson.h文件
- (YLGPerson *(^)(NSString *food))eat;
- (YLGPerson *(^)(NSString *time))run;

複製代碼

做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人iOS交流羣:413038000,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!web

如下資料在羣文件可自行下載!點擊此處 快速入羣

推薦閱讀

iOS開發——2020 最新 BAT面試題合集(持續更新中)

YLGPerson.m文件面試

//MARK: -- Eat 
- (YLGPerson *(^)(NSString *food))eat {
  return ^(NSString *food) {
    NSLog(@"吃了%@",food);
    return self;
  }
}
//MARK: -- Run
- (YLGPerson *(^)(NSString *time))run {
  return ^(NSString *time) {
    NSLog(@"跑了%@分鐘",time);
    return self;
  }
}

複製代碼

ViewController.m文件編程

YLGPerson *person = YLGPerson.new;
person.eat(@"香蕉").run(@"60").eat(@"牛奶")

複製代碼

注:點語法使得代碼簡單易讀,書寫方便。鏈式編程的表明:masonry框架bash

二、函數式編程

  • 定義:對象調用函數後,此函數的返回值就是該對象自己,進而能夠繼續調用該對象的其餘函數。
  • 特色:能夠嵌套的調用對象所擁有的函數。
  • 舉例: YLGPerson.h文件
@property (nonatomic, assign, readonly) NSInteger result;
- (YLGPerson *)calculator:(NSInteger (^)(NSInteger result))block;

複製代碼

YLGPerson.m文件框架

@property (nonatomic, assign, readwrite) NSInteger result;
- (YLGPerson *)calculator:(NSInteger (^)(NSInteger result))block {
  _result = block(_result);
  return self;
}

複製代碼

ViewController.m文件ide

YLGPerson *person = YLGPerson.new;
[person calculator:^NSInteger (NSInteger result){
  result += 8;
  result *=2;
  return result;
}];

複製代碼

注:函數式編程的表明:ReactiveCocoa框架函數式編程

三、響應式編程

  • 定義:某一個變量的值會隨着另外一個變量的值改變而改變,它是和事件流有關的編程模式。
  • 特色:在編程過程當中創建一個動態的數據流關係。
  • 舉例:
a = 2;
b = 6;
c = a + b; //c is 8
b = 1;
//now what is the value of c?

複製代碼

若是使用FRP,c的值將會隨着b的值改變而改變,因此叫作「響應式編程」。比較直觀的例子就是Excel,當改變某一個單元格的內容時,該單元格相關的計算結果也會隨之改變。 FRP提供了一種信號機制來實現這樣的效果,經過信號來記錄值的變化。信號能夠被疊加、分割或合併。經過對信號的組合,就不須要去監聽某個值或事件。以下圖:函數

image

3、函數響應式編程

  • 定義:響應式編程思想爲體,函數式編程思想爲用。以下圖:

    image

  • 優勢:簡潔明瞭,可讀性強,複用性強。

  • 舉例

  1. 傳統寫法
var customButton: UIButton!  = UIButton()
customButton.addTarget(self, action: #selector(clickCustomButton), for: .touchUpInside)
@objc func clickCustomButton() {
   print("customButton clicked!")
}

複製代碼
  1. RxSwift寫法
self.customButton.rx.tap     //事件序列
            .subscribe(onNext: { () in   //訂閱
                print("RxSwift customButton clicked!")
            }, onError: { (error) in //發生錯誤回調
                print("錯誤信息")
            }, onCompleted: {  //任務完成回調
                print("訂閱完成")
            })
            .disposed(by: DisposeBag())    //對象銷燬

複製代碼

參考文檔:

blog.csdn.net/kyl28288954… limboy.me/tech/2013/0… www.jianshu.com/p/df4a949e3…

做者:寫下歲月的痕跡

相關文章
相關標籤/搜索