ReactiveSwift源碼解析(十二) MutableProperty基本代碼實現

前兩篇博客咱們分別聊了ReactiveSwift框架中的負責標記對象的生命週期的類Lifetime以及負責原子性操做的Atomic類的具體代碼實現。前兩篇博客之因此聊Lifetime以及Atomic的代碼實現,就是爲了今天這篇博客作鋪墊的。在Property以及MutableProperty的代碼實現中咱們會用到Lifetime以及Atomic。本篇博客咱們就來仔細的探討一下Property以及MutableProperty的代碼實現。html

由於MutableProperty用處更多,並且MutableProperty的代碼實現比Property要複雜一些,那麼本篇博客咱們就以MutableProperty爲例來看一下其代碼實現。之因此在本篇博客中聊Property的代碼實現,在於以前咱們已經陸陸續續的聊了Event、Observer、Signal、SignalProducer、Lifetime以及Atomic的代碼實現。而Property就是在上述基礎上的進一步封裝。git

下方咱們先來看一下MutableProperty的一個簡單的使用示例,而後根據該示例來看一下MutableProperty的基本代碼實現。看完基本代碼實現後,下方也會根據相應的示例來看一下Property的一些經常使用的擴展方法的具體實現。github

 

1、MutableProperty的簡單應用示例閉包

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

一、MutableProperty中的Signal對象post

下方示例展現了MutableProperty中的signal對象的使用方式。下方是對該段代碼的解釋:atom

  • 首先咱們建立了一個可變的屬性對象 mutableProperty,該屬性的初始值爲1。
  • 而後給該屬性對象中的signal對象添加一個Value事件的觀察者,在該觀察者中輸出所觀察到的值Value。當mutableProperty所關聯的值被修改時,就會執行該觀察者所對應的事件閉包。
  • 接着咱們就修改mutableProperty對象的value的值,將該值修改爲10。而後就獲取該值進行輸出

  

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

 

二、MutableProperty中的SignalProducer對象spa

下方是MutablePropertySignalProducer對象的簡單使用示例。下方代碼示例與上方的代碼片斷相似,輸出結果也差很少,只不過SignalProducer對象的Value事件會先輸出當前MutableProperty對象中所存儲的值。當修改MutableProperty中所存儲的值時,就會執行SignalProducer中內置的Signal的Value事件。具體以下所示:3d

  

 

 

2、MutableProperty類的基本實現

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

一、MutableProperty的屬性以及構造器

下方代碼片斷就是MutableProperty中的核心屬性以及主要的構造器,若是詳細的看了以前的博客的話,下方這幾個屬性並不陌生,接下來咱們來一一介紹:

  • token和lifetime屬性負責標記MutableProperty的生命週期,關於Lifetime的代碼實現與具體工做方式,請移步於《Lifetime代碼實現》。
  • signal與observer則負責在修改value值時給觀察者發送事件的,Signal與Observer的具體代碼實現以及工做方式在以前的博客中也詳細的介紹過來,在此不作過多贅述了。
  • atomic屬性則負責原子操做的,從下方的atomic的屬性類型咱們能夠看出該原子操做添加的是遞歸鎖。關於Atomic的詳細內容咱們以前的博客也介紹過了,詳情請移步於《Atomic的代碼實現以及其中的Defer延遲、Posix互斥鎖、遞歸鎖》。
  • value屬性是一個計算屬性,其中的get和set方法主要是調用atomic屬性中的相應的方法進行值的獲取和賦值操做。
  • producer屬性也是一個計算屬性,其中返回了一個SignalProducer類的對象。從代碼中咱們不難看出該producer對象中的signal對象與MutableProperty中的signal對象進行了橋接,也就是說,該producer屬性能夠收到來自MutableProperty中信號量的事件。關於SignalProducer的詳細內容請移步於《SignalProducer的基本實現及使用方式》。
  • MutableProperty的構造器就是對上述這些未被初始化的屬性進行初始化了。其中須要注意的一點是Atomic對象的初始化,在atomic屬性初始化是,將observer屬性的Value事件的執行塊賦值給了didSet閉包因此當atomic中的value值被修改後就會調用observer的send(value)事件,這一點在MutableProperty中仍是比較重要的。

   

 

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

  

 

二、MutableProperty類中基本方法的代碼實現

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

  

今天的博客就先到這兒,下篇博客咱們會挑一些MutableProperty的擴展方法中比較重要和基礎的方法進行介紹。Property以及MutableProperty中的其餘擴展方法大部分都是在SignalProducer以及Signal的基礎上所創建起來的,功能也是大同小異,在此就不作過多贅述了。

上述代碼github分享地址:https://github.com/lizelu/TipSwiftForRac 

相關文章
相關標籤/搜索