天天看點

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

前兩篇部落格我們分别聊了ReactiveSwift架構中的負責标記對象的生命周期的類Lifetime以及負責原子性操作的Atomic類的具體代碼實作。前兩篇部落格之是以聊Lifetime以及Atomic的代碼實作,就是為了今天這篇部落格做鋪墊的。在Property以及MutableProperty的代碼實作中我們會用到Lifetime以及Atomic。本篇部落格我們就來仔細的探讨一下Property以及MutableProperty的代碼實作。

因為MutableProperty用處更多,而且MutableProperty的代碼實作比Property要複雜一些,那麼本篇部落格我們就以MutableProperty為例來看一下其代碼實作。之是以在本篇部落格中聊Property的代碼實作,在于之前我們已經陸陸續續的聊了Event、Observer、Signal、SignalProducer、Lifetime以及Atomic的代碼實作。而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。然後就擷取該值進行輸出

  

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

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

2、MutableProperty中的SignalProducer對象

下方是MutableProperty中SignalProducer對象的簡單使用示例。下方代碼示例與上方的代碼片段類似,輸出結果也差不多,隻不過SignalProducer對象的Value事件會先輸出目前MutableProperty對象中所存儲的值。當修改MutableProperty中所存儲的值時,就會執行SignalProducer中内置的Signal的Value事件。具體如下所示:

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

二、MutableProperty類的基本實作

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

1、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中還是比較重要的。
ReactiveSwift源碼解析(十二) MutableProperty基本代碼實作

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

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

2、MutableProperty類中基本方法的代碼實作

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

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

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

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

作者:青玉伏案

出處:http://www.cnblogs.com/ludashi/

本文版權歸作者和共部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。

收履歷:某網際網路公司,招聘iOS/Android靠譜工程師,入職後,可内部聯系樓主,有小禮品贈送,有意者可郵箱投遞履歷:[email protected]

上一篇: HTTP/3 來了 !
下一篇: Java中的鎖