RxSwift:RIP

蘋果經過他們本身的reactive框架終結了RxSwift嗎?前端

如今你可能瞭解到了WWDC的最大的新聞:SwiftUI。若是沒有,你能夠花一點時間瞭解一下你是一個iOS前專家嗎react

無論怎樣,你可能不知道的是蘋果已經同時讓RxSwift涼涼了。這個終結者內置在iOS 13,iPadOS 13,macOS 10.15,watch OS 6和tvOS 13中。ios

Combine

Combine是蘋果本身的reactive框架:bash

Combine框架提供了一個聲明性的Swift API,用於隨時間處理值。這些值能夠表示用戶界面事件,網絡響應,計劃事件和許多其餘類型的異步數據。網絡

Combine聲明Publisher以公開可隨時間變化的值,以及訂閱者從發佈者接收這些值。閉包

Combine也提供了不少操做符來控制這些值,下面這個列表裏你能看見不少不少熟悉的面孔。app

Filter, map, flatMap, compactMap, combine, merge, concat, zip, reduce, scan, throttle, debounce, timeout...框架

還有不少功能相同可是名字不一樣的,好比collect和toArray、prepend和startWith、removeDuplicates和distinctUntilChanged異步

Combine框架還加了一些新東西,好比count還有measureInterval。oop

咱們來看一下下面的代碼:

let subject1 = CurrentValueSubject<Int, TypedError>(1)
let subject2 = PassthroughSubject<Int, TypedError>()
let subscription = subject1
    .combineLatest(subject2) { return $0 + $1 }
    .map { "\($0)" }
    .subscribe(on: ImmediateScheduler.shared)
    .sink(receiveCompletion: { c in
        if case let .failure(error) = c {
            print("error \(error)")
        }
    }, receiveValue:  { (value) in
        print(value)
    })
subject1.send(1)
subject1.send(2)
subject2.send(3)
subject2.send(6)
複製代碼

看着是否是很熟悉?

RxSwift就這樣涼了嗎?

答案無非是:是、否還有或許的其中一個。

目前爲止答案仍是否。像SwiftUI、Combine框架都要求iOS 13,它還不能取代全部的東西。

RxSwift是數千個現有iOS和macOS項目的重要組成部分,因此如今答案仍是否......

可能會成真嗎?

這種狀況相似於Apple將Codable引入Swift 4......而且在此過程當中幾乎全部其餘第三方JSON編碼/解碼庫都已過期。

隨着時間的推移,根據個人經驗,大多數應用程序已經放棄了這些第三方庫並接受了Codable。我知道咱們的工做,清理咱們的代碼,消除另外一個第三方依賴,並在此過程當中減小技術債務。

此外,SwiftUI已將Combine融入其DNA中,由於它是用於觸發UI更改和更新的主要機制。這意味着使用SwiftUI的每一個人都將接觸到Combine。

當您的平臺上已存在等效功能時,您是否要導入另外一個第三方庫?

可能?

也就是說,咱們尚未思考RxCocoa集成,Combine結合到Notifications和Timer還有其餘系統服務裏面。不是說尚未,只是目前尚未看見。

XCode 11的release note:

The Foundation integration for the Combine framework is unavailable. The following Foundation and Grand Central Dispatch integrations with Combine are unavailable: KeyValueObserving, NotificationCenter, RunLoop, OperationQueue, Timer, URLSession, DispatchQueue, JSONEncoder, JSONDecoder, PropertyListEncoder, PropertyListDecoder, and the @Publishedproperty wrapper.

很顯然,其餘的系統集成將要到來,讓人期待。

跨平臺編碼

另外一個否認的理由是一些公司使用Rx進行多平臺的開發,以便更好地共享代碼和業務邏輯。

因此,使用的語法還有提供的操做很是類似。與Combine之間的翻譯不會特別麻煩。

毋庸置疑,使用RxSwift的人們很是瞭解Combine及其含義,而且正忙着決定RxSwift如何融入這一新領域。

在Combine上重建Rx?提供適配器,就像RxDart與Flutter同樣?只需輸入別名Observables to Publishers?

拭目以待吧!

我從不費心去學習RxSwift

一些讀過這篇文章的人可能會感到有些沾沾自喜,由於他們從不費心去學習RxSwift,而如今它已經「RIP」,將永遠不須要這樣作。

可是,雖然RxSwift可能會逐漸消失,但它激發和鼓勵的反應原則絕對不會消失。他們仍然在那裏。

像上面提到的同樣,Combine是SwiftUI的前端和中心。它是將狀態更改傳遞給Views的主要和必需機制。

final class UserData: BindableObject  {
    let didChange = PassthroughSubject<UserData, Never>()

    var showFavoritesOnly = false {
        didSet { didChange.send(self) }
    }
    var landmarks = landmarkData {
        didSet { didChange.send(self) }
    }
}

複製代碼

不管你是否是喜歡,Reactive技術都是將來。

總結

正如Apple所說,經過採用Combine,您能夠經過集中事件處理代碼並消除麻煩的閉包和基於約定的回調等麻煩的技術,使代碼更易於閱讀和維護。

就像RxSwift所說的那樣。

由於若是你學會了RxSwift,你所知道和喜好的Reactive原則將爲你提供良好的服務。

本站公眾號
   歡迎關注本站公眾號,獲取更多信息