一、響應式編程
響應式編程使用三個核心概念:數(shù)據(jù)流,函數(shù)式編程和異步觀察。
數(shù)據(jù)流 Data Streams:比如一個 Timer 每隔 1 秒發(fā)布一個數(shù),這個數(shù)依次遞增 。那么這個 Timer 就可以是一個發(fā)布者 Publisher。它發(fā)布的內(nèi)容就會形成一個數(shù)據(jù)流。好像這樣:1 – 2 – 3 – 4 – …..函數(shù)式編程 Functional Programming:有了這個數(shù)據(jù)流你需要一個一個數(shù)據(jù)的處理吧,這是你你不是把它當成一個 Array 來處理,因為數(shù)據(jù)是一個一個來的,你不知道它的終點在哪。因此你自己制定一些標準來篩選想要的。比如你想篩選偶數(shù)來做下一步處理,就用 .filter { return value % 2 == 0 }。這么一操作就把偶數(shù)留下來了,其余的數(shù)據(jù)全部不用。而這個處理數(shù)據(jù)的思路就是函數(shù)式編程的思想。異步觀察 Asynchronous Observers:這些處理好的數(shù)據(jù)給誰聽呢?這里正是 Subscriber 來聽。比如你想沒兩秒更改一次 UI 上面的圖標,顯示遞增的偶數(shù)。那么就會訂閱上面那個 Publisher,然后把它處理出來的數(shù)據(jù)更新到 UI 的 Label 上面。區(qū)分一下指令時編程和函數(shù)式編程。指令式編程就是我們熟悉的 if else 一步一步來。而函數(shù)式編程則是把功能提出來,不和數(shù)據(jù)本身的類型掛鉤。比如 Filter 函數(shù),就是篩選滿足某種條件的數(shù)據(jù)。而響應式編程是什么呢?其實是對數(shù)據(jù)的處理,處理后發(fā)送給訂閱者。
因此你也可以理解成響應式編程是對數(shù)據(jù)做出反饋,而這里判斷數(shù)據(jù)的時候就用到了函數(shù)式編程的思想。為什么響應式編程使用了函數(shù)式編程的核心思想呢?主要是因為函數(shù)式編程是 Stateless 的,因此不會有副作用。而響應式編程想處理的就是數(shù)據(jù)流,所以也有人把響應式編程叫做數(shù)據(jù)流編程。
「響應式」這三個字描述的是我們的對數(shù)據(jù)流的處理方式,對數(shù)據(jù)變化作出響應。「函數(shù)式」指的是處理數(shù)據(jù)的編程方法,描述你想保留刪選或者如何變更數(shù)據(jù)?!负瘮?shù)式」是「描述式」編程的一種體現(xiàn)。
這里我覺得蘋果 Combine 響應式框架的解釋很好,放在這里你感受一下。
The Combine framework provides a declarative Swift API for processing values over time. These values can represent many kinds of asynchronous events. Combine declares?publishers?to expose values that can change over time, and?subscribers?to receive those values from the publishers.
我大概翻譯一下:Combine 框架提供了描述式 API 用以處理數(shù)據(jù)流。這些數(shù)據(jù)可以代表多種異步事件。Combine 框架使用 Publisher 來講數(shù)據(jù)變更呈現(xiàn)出來;Subscriber 負責從發(fā)布者那里接受數(shù)據(jù)。
Combine 框架和 RxJava, RxJS, RxSwift 等一些列響應式框架和原理是一樣的,因此你可以遠離互通。下面的這些函數(shù)就是 Combine 框架 Publisher 函數(shù)的一些范例,你也可以把這些處理數(shù)據(jù)的函數(shù)叫做「函數(shù)式編程」。
延伸閱讀:
二、同步與異步
分布式網(wǎng)絡系統(tǒng)中,各個參與方節(jié)點的運行是相互獨立的,沒有共享內(nèi)存,沒有全局時鐘。各節(jié)點通過消息來進行溝通。在傳統(tǒng)的理念中,我們會把這樣的網(wǎng)絡根據(jù)他們通信方式描述成同步和異步的。
同步(Synchronous)就是整個處理過程順序執(zhí)行,當各個過程都執(zhí)行完畢,并返回結果。是一種線性執(zhí)行的方式,執(zhí)行的流程不能跨越。一般用于流程性比較強的程序,比如用戶登錄,需要對用戶驗證完成后才能登錄系統(tǒng)。異步(Asynchronous)則是只是發(fā)送了調用的指令,調用者無需等待被調用的方法完全執(zhí)行完畢;而是繼續(xù)執(zhí)行下面的流程。是一種并行處理的方式,不必等待一個程序執(zhí)行完,可以執(zhí)行其它的任務,比如頁面數(shù)據(jù)加載過程,不需要等所有數(shù)據(jù)獲取后再顯示頁面。