1. 程式人生 > IOS開發 >iOS中的函式響應式程式設計思想

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提供了一種訊號機制來實現這樣的效果,通過訊號來記錄值的變化。訊號可以被疊加、分割或合併。通過對訊號的組合,就不需要去監聽某個值或事件。如下圖:

image

三、函式響應式程式設計

  • 定義:響應式程式設計思想為體,函式語言程式設計思想為用。如下圖:

    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…

作者:寫下歲月的痕跡