IOS-響應式程式設計
阿新 • • 發佈:2019-02-09
理論
函數語言程式設計
1.如果想再去呼叫別的方法,那麼就需要返回一個物件;
2.如果想用()去執行,那麼需要返回一個block;
3.如果想讓返回的block再呼叫物件的方法,那麼這個block就需要返回一個物件(即返回值為一個物件的block)。
4.高階函式:在函數語言程式設計中,把函式當引數來回傳遞,而這個,說成術語,我們把他叫做高階函式。在oc中,blocks是被廣泛使用的引數傳遞,它實際上是匿名函式。
- 一個命令呼叫後的輸出當作另一個命令輸入,多個命令之間可以串起來操作
響應式程式設計(Functional Reactive Programming:FRP)
1.響應式程式設計是一種和事件流有關的程式設計模式,關注導致狀態值改變的行為事件,一系列事件組成了事件流。
2.一系列事件是導致屬性值發生變化的原因。FRP非常類似於設計模式裡的觀察者模式。
3.FRP與普通的函數語言程式設計相似,但是每個函式可以接收一個輸入值的流,如果其中,一個新的輸入值到達的話,這個函式將根據最新的輸入值重新計算,並且產生一個新的輸出。這是一種”資料流”程式設計模式。
為什麼我們要用它
1) 開發過程中,狀態以及狀態之間依賴過多,RAC更加有效率地處理事件流,而無需顯式去管理狀態。在OO或者程序式程式設計中,狀態變化是最難跟蹤,最頭痛的事。這個也是最重要的一點。
2) 減少變數的使用,由於它跟蹤狀態和值的變化,因此不需要再申明變數不斷地觀察狀態和更新值。
3) 提供統一的訊息傳遞機制,將oc中的通知,action,KVO以及其它所有UIControl事件的變化都進行監控,當變化發生時,就會傳遞事件和值。
4) 當值隨著事件變換時,可以使用map,filter,reduce等函式便利地對值進行變換操作。
UIButton
@weakify(self);
self.button.rac_command = [[RACCommand alloc]initWithSignalBlock:^RACSignal*(id input)]{
@strongify (self);
return [RACSignal empty];
}];
UIAlertView
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"您正在使用4G/3G/2G網路,繼續觀看可能產生超額流量費" delegate:nil cancelButtonTitle:@"返回" otherButtonTitles:@"繼續觀看", nil];
[alertView show];
@weakify(self);
[alertView.rac_buttonClickedSignal subscribeNext:^(NSNumber * x) {
@strongify(self);
if (x.intValue == 0) {
}else {
}
}];
網路請求
//冷訊號
_liveRoomCommand = [[RACCommand alloc]
initWithSignalBlock:^RACSignal *(id input) {
@strongify(self);
//請求網路,賦值給liveModel
return [RACSignal empty];
}];
//接受model資料
//skip:.監聽命令是否執行完畢,預設會來一次,可以直接跳過,skip表示跳過第一次訊號。
//deliverOnMainThread:在主執行緒力主執行緒
[[[RACObserve(self.liveViewModel, liveModel) skip:1] deliverOnMainThread] subscribeNext:^(id x) {
@strongify(self);
//更新UI
}];
//啟用訊號
[self.liveViewModel.liveRoomCommand execute:nil];