1. 程式人生 > >IOS-響應式程式設計

IOS-響應式程式設計

理論

函數語言程式設計

1.如果想再去呼叫別的方法,那麼就需要返回一個物件;

2.如果想用()去執行,那麼需要返回一個block;

3.如果想讓返回的block再呼叫物件的方法,那麼這個block就需要返回一個物件(即返回值為一個物件的block)。

4.高階函式:在函數語言程式設計中,把函式當引數來回傳遞,而這個,說成術語,我們把他叫做高階函式。在oc中,blocks是被廣泛使用的引數傳遞,它實際上是匿名函式。

  1. 一個命令呼叫後的輸出當作另一個命令輸入,多個命令之間可以串起來操作

響應式程式設計(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];