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

本站公众号
   欢迎关注本站公众号,获取更多信息