iOS中的函式響應式程式設計思想
一、前言
最近正在學習iOS底層框架,在學習RxSwift的課程時,涉及到了函式響應式程式設計的思想,這讓我想起了在工作專案中使用到的ReactiveCocoa第三方庫,它裡面也使用了函式響應式程式設計思想,之前只是看了簡單的介紹,並會使用它而已,現在必須徹底去掌握該思想--函式響應式程式設計(FRP(Functional Reactive Programming)),下面就讓我們一起揭開函式響應式程式設計思想的神祕面紗。
二、基本概念
在iOS開發中,有三種程式設計思想,分別是鏈式程式設計、函式語言程式設計和響應式程式設計。
1、鏈式程式設計
- 定義:它是可以通過“點”語法,進行呼叫所執行的函式或程式碼塊,並可以連續的使用。
- 特點:方法必須有返回值,並且該值是物件本身;返回值的形式可以是Block塊(返回值必須是物件本身,也可帶引數)也可以是物件本身。
- 舉例: YLGPerson.h檔案
- (YLGPerson *(^)(NSString *food))eat;
- (YLGPerson *(^)(NSString *time))run;
複製程式碼
作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的iOS交流群:413038000,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長!
以下資料在群檔案可自行下載!點選此處 快速入群
推薦閱讀
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框架
2、函式語言程式設計
- 定義:物件呼叫函式後,此函式的返回值就是該物件本身,進而可以繼續呼叫該物件的其他函式。
- 特點:可以巢狀的呼叫物件所擁有的函式。
- 舉例: YLGPerson.h檔案
@property (nonatomic,assign,readonly) NSInteger result;
- (YLGPerson *)calculator:(NSInteger (^)(NSInteger result))block;
複製程式碼
YLGPerson.m檔案
@property (nonatomic,readwrite) NSInteger result;
- (YLGPerson *)calculator:(NSInteger (^)(NSInteger result))block {
_result = block(_result);
return self;
}
複製程式碼
ViewController.m檔案
YLGPerson *person = YLGPerson.new;
[person calculator:^NSInteger (NSInteger result){
result += 8;
result *=2;
return result;
}];
複製程式碼
注:函式語言程式設計的代表:ReactiveCocoa框架
3、響應式程式設計
- 定義:某一個變數的值會隨著另一個變數的值改變而改變,它是和事件流有關的程式設計模式。
- 特點:在程式設計過程中建立一個動態的資料流關係。
- 舉例:
a = 2;
b = 6;
c = a + b; //c is 8
b = 1;
//now what is the value of c?
複製程式碼
如果使用FRP,c的值將會隨著b的值改變而改變,所以叫做「響應式程式設計」。比較直觀的例子就是Excel,當改變某一個單元格的內容時,該單元格相關的計算結果也會隨之改變。 FRP提供了一種訊號機制來實現這樣的效果,通過訊號來記錄值的變化。訊號可以被疊加、分割或合併。通過對訊號的組合,就不需要去監聽某個值或事件。如下圖:
三、函式響應式程式設計
-
定義:響應式程式設計思想為體,函式語言程式設計思想為用。如下圖:
-
優點:簡潔明瞭,可讀性強,複用性強。
-
舉例
- 傳統寫法
var customButton: UIButton! = UIButton()
customButton.addTarget(self,action: #selector(clickCustomButton),for: .touchUpInside)
@objc func clickCustomButton() {
print("customButton clicked!")
}
複製程式碼
- 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…
作者:寫下歲月的痕跡