1. 程式人生 > >ReactiveSwift原始碼解析(十二) MutableProperty基本程式碼實現

ReactiveSwift原始碼解析(十二) MutableProperty基本程式碼實現

前兩篇部落格我們分別聊了ReactiveSwift框架中的負責標記物件的生命週期的類Lifetime以及負責原子性操作的Atomic類的具體程式碼實現。前兩篇部落格之所以聊Lifetime以及Atomic的程式碼實現,就是為了今天這篇部落格做鋪墊的。在Property以及MutableProperty的程式碼實現中我們會用到Lifetime以及Atomic。本篇部落格我們就來仔細的探討一下Property以及MutableProperty的程式碼實現。

因為MutableProperty用處更多,而且MutableProperty的程式碼實現比Property要複雜一些,那麼本篇部落格我們就以MutableProperty為例來看一下其程式碼實現。之所以在本篇部落格中聊Property的程式碼實現,在於之前我們已經陸陸續續的聊了Event、Observer、Signal、SignalProducer、Lifetime以及Atom

ic的程式碼實現。而Property就是在上述基礎上的進一步封裝。

下方我們先來看一下MutableProperty的一個簡單的使用示例,然後根據該示例來看一下MutableProperty的基本程式碼實現。看完基本程式碼實現後,下方也會根據相應的示例來看一下Property的一些常用的擴充套件方法的具體實現。

一、MutableProperty的簡單應用示例

我們還是由簡到繁的步驟,本部分我們會給出兩個MutableProperty使用的簡單示例。一個是關於Property中的Signal的,另一個是關於Property中的SignalProducer的。下部分內容我們會給據該部分的示例以及示例的輸出結果來分析MutableProperty具體的程式碼實現。

1、MutableProperty中的Signal物件

下方示例展示了MutableProperty中的signal物件的使用方式。下方是對該段程式碼的解釋:

  • 首先我們建立了一個可變的屬性物件mutableProperty,該屬性的初始值為1。
  • 然後給該屬性物件中的signal物件新增一個Value事件的觀察者,在該觀察者中輸出所觀察到的值Value。當mutableProperty所關聯的值被修改時,就會執行該觀察者所對應的事件閉包。
  • 接著我們就修改mutableProperty物件的value的值,將該值修改成10。然後就獲取該值進行輸出

  

上述截圖的最下方就是該示例的輸出結果,從該結果中我們不難看出,當可變屬性被賦值時Value事件的閉包體就會執行。而通過withValue以及value屬性就可以獲取到該值。在獲取值時不會執行上述閉包事件。

2、MutableProperty中的SignalProducer物件

下方是MutablePropertySignalProducer物件的簡單使用示例。下方程式碼示例與上方的程式碼片段類似,輸出結果也差不多,只不過SignalProducer物件的Value事件會先輸出當前MutableProperty物件中所儲存的值。當修改MutableProperty中所儲存的值時,就會執行SignalProducer中內建的Signal的Value事件。具體如下所示:

  

二、MutableProperty類的基本實現

看完第一部分的MutableProperty的簡單的使用方式,接下來我們就來看一下MutableProperty類的基本實現。MutableProperty類的基本實現是比較簡單的主要包括Signal、Observer物件的初始化,還有Lifetime物件的初始化,以及Atomic物件的初始化操作。而MutableProperty類的核心方法都在其擴充套件中,稍後會介紹到。接下來我們先看一下MutableProperty中的屬性、構造器以及基本方法。

1、MutableProperty的屬性以及構造器

下方程式碼片段就是MutableProperty中的核心屬性以及主要的構造器,如果詳細的看了之前的部落格的話,下方這幾個屬性並不陌生,接下來我們來一一介紹:

  • token和lifetime屬性負責標記MutableProperty的生命週期,關於Lifetime的程式碼實現與具體工作方式,請移步於《》。
  • signal與observer則負責在修改value值時給觀察者傳送事件的,Signal與Observer的具體程式碼實現以及工作方式在之前的部落格中也詳細的介紹過來,在此不做過多贅述了。
  • atomic屬性則負責原子操作的,從下方的atomic的屬性型別我們可以看出該原子操作新增的是遞迴鎖。關於Atomic的詳細內容我們之前的部落格也介紹過了,詳情請移步於《》。
  • value屬性是一個計算屬性,其中的get和set方法主要是呼叫atomic屬性中的相應的方法進行值的獲取和賦值操作。
  • producer屬性也是一個計算屬性,其中返回了一個SignalProducer類的物件。從程式碼中我們不難看出該producer物件中的signal物件與MutableProperty中的signal物件進行了橋接,也就是說,該producer屬性可以收到來自MutableProperty中訊號量的事件。關於SignalProducer的詳細內容請移步於《》。
  • MutableProperty的構造器就是對上述這些未被初始化的屬性進行初始化了。其中需要注意的一點是Atomic物件的初始化,在atomic屬性初始化是,將observer屬性的Value事件的執行塊賦值給了didSet閉包所以當atomic中的value值被修改後就會呼叫observer的send(value)事件,這一點在MutableProperty中還是比較重要的。

   

根據上述程式碼的屬性以及構造器,我們不難畫出下方這個簡圖。該圖給出了上述屬性的各種關係,以及當MutableProperty的Value值被修改時,SentValue事件的走向,具體如下所示。

  

2、MutableProperty類中基本方法的程式碼實現

接下來我們就來看一下MutableProperty類中其他方法的實現。下方就是MutableProperty類中剩餘的方法,下方的方法比較簡單,主要是對atomic屬性中相關方法的二次封裝,具體如下所示:

  

今天的部落格就先到這兒,下篇部落格我們會挑一些MutableProperty的擴充套件方法中比較重要和基礎的方法進行介紹。Property以及MutableProperty中的其他擴充套件方法大部分都是在SignalProducer以及Signal的基礎上所建立起來的,功能也是大同小異,在此就不做過多贅述了。