RxSwift:RIP

3,195 阅读4分钟

苹果通过他们自己的reactive框架终结了RxSwift吗?

现在你可能了解到了WWDC的最大的新闻:SwiftUI。如果没有,你可以花一点时间了解一下你是一个iOS前专家吗

不管怎样,你可能不知道的是苹果已经同时让RxSwift凉凉了。这个终结者内置在iOS 13,iPadOS 13,macOS 10.15,watch OS 6和tvOS 13中。

Combine

Combine是苹果自己的reactive框架:

Combine框架提供了一个声明性的Swift API,用于随时间处理值。这些值可以表示用户界面事件,网络响应,计划事件和许多其他类型的异步数据。

Combine声明Publisher以公开可随时间变化的值,以及订阅者从发布者接收这些值。

Combine也提供了很多操作符来控制这些值,下面这个列表里你能看见很多很多熟悉的面孔。

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

还有很多功能相同但是名字不同的,比如collect和toArray、prepend和startWith、removeDuplicates和distinctUntilChanged

Combine框架还加了一些新东西,比如count还有measureInterval。

我们来看一下下面的代码:

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原则将为你提供良好的服务。