最近正在學習iOS底層框架,在學習RxSwift的課程時,涉及到了函數響應式編程的思想,這讓我想起了在工做項目中使用到的ReactiveCocoa第三方庫,它裏面也使用了函數響應式編程思想,以前只是看了簡單的介紹,並會使用它而已,如今必須完全去掌握該思想--函數響應式編程(FRP(Functional Reactive Programming)),下面就讓咱們一塊兒揭開函數響應式編程思想的神祕面紗。html
在iOS開發中,有三種編程思想,分別是鏈式編程、函數式編程和響應式編程。react
- (YLGPerson *(^)(NSString *food))eat;
- (YLGPerson *(^)(NSString *time))run;
複製代碼
做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人iOS交流羣:413038000,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!web
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
@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提供了一種信號機制來實現這樣的效果,經過信號來記錄值的變化。信號能夠被疊加、分割或合併。經過對信號的組合,就不須要去監聽某個值或事件。以下圖:函數
定義:響應式編程思想爲體,函數式編程思想爲用。以下圖:
優勢:簡潔明瞭,可讀性強,複用性強。
舉例
var customButton: UIButton! = UIButton()
customButton.addTarget(self, action: #selector(clickCustomButton), for: .touchUpInside)
@objc func clickCustomButton() {
print("customButton clicked!")
}
複製代碼
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…
做者:寫下歲月的痕跡