CoreEngine
简单轻盈
Core是通过受ReactorKit和Redux启发而创建的更响应式应用的框架。
可扩展性
Core是一个独立的事件驱动框架,这意味着您可以选择导入任何您想要的功能,例如Combine,RxSwift等。
其架构非常轻量级和简单,因此您可以选择使用CocoaPods或SPM来保持更新,或者直接将它们拖入您的项目中即可使用。或者,您可以仔细查看代码,自己进行修改。
安装
CoreEngine可以通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
pod 'CoreEngine'
性能
与类似的框架相比,Core Engine超级快且轻量级。您可以在此处查看详细信息CoreEngineBenchMark
示例
有关示例的详细信息请参阅
// on ViewController
let label = UILabel()
let increaseButton = UIButton()
let decreaseButton = UIButton()
var core: MainCore = .init()
func increaseButtonTapped() {
self.core.action(.increase)
}
func decreaseButtonTapped() {
self.core.action(.decrease)
}
func bind() {
core.$state.map(\.count)
.sink { [weak self] count in
self?.label.text = "\(count)"
}
.store(in: &subscription)
}
...
class MainCore: Core {
var subscription: Set<AnyCancellable> = .init()
enum Action: Equatable, Hashable {
case increase
case decrease
}
struct State: Equatable {
var count = 0
}
@Published var state: State = .init()
func reduce(state: State, action: Action) -> State {
var newState = state
switch action {
case .decrease:
newState.count -= 1
case .increase:
newState.count += 1
}
return newState
}
}
副作用与错误处理
不仅仅支持简单的核心,还支持复杂的核心。例如,副作用和错误处理。当涉及到这些时,您使用AnyCore
。
它并不与Core有很大不同,因为AnyCore也符合。
func dispatch(effect: any Publisher) & func handleError(error: Error)
此方法在 AnyCore 中定义,当您处理发送到函数的副作用产生的发布者时。您还可以在 handleError(error: Error)
函数中处理所有错误
以下是 AnyCore
的一个示例
class MainCore: AnyCore {
var subscription: Set<AnyCancellable> = .init()
enum Action {
case increase
case decrease
case jump(Int)
case setNumber(Int)
}
struct State {
var count = 0
}
@Published var state: State = .init()
@Published var tenGap: Int = 10
private let sessionService = SessionService()
init {
dispatch(effect: sessionService.randomUInt$().map(Action.setNumber))
}
func reduce(state: State, action: Action) -> State {
var newState = state
switch action {
case .increase:
newState.count += 1
case .decrease:
newState.count -= 1
case let .jump(value):
newState.count += value
case let .setNumber(value):
newState.count = value
}
return newState
}
func handleError(error: Error) {
if let errpr = error as? MyError {
//handle
}
}
func tenJumpAction() {
self.dispatch(effect: $tenGap.map(Action.jump))
}
}
class SessionService {
func randomUInt$() -> AnyPublisher<Int, Error> {
// blahblah
}
}
示例 + RxSwift
复制这些代码到 RxSwift
import Foundation
import CoreEngine
import RxSwift
protocol RxCore: Core {
var disposeBag: DisposeBag { get set }
func mutate(effect: Observable<Action>)
func handleError(error: Error)
}
extension RxCore {
public func mutate(effect: Observable<Action>) {
effect
.subscribe(onNext: { [weak self] in
if let self {
self.state = self.reduce(state: self.state, action: $0)
}
}, onError: { [weak self] in
self?.handleError(error: $0)
})
.disposed(by: disposeBag)
}
public func handleError(error: Error) { }
}
@propertyWrapper
class ObservableProperty<Element>: ObservableType {
var wrappedValue: Element {
didSet {
subject.onNext(wrappedValue)
}
}
private let subject: BehaviorSubject<Element>
init(wrappedValue: Element) {
self.wrappedValue = wrappedValue
self.subject = BehaviorSubject<Element>(value: wrappedValue)
}
var projectedValue: Observable<Element> {
return subject.asObservable()
}
func subscribe<Observer>(_ observer: Observer) -> Disposable where Observer : ObserverType, Element == Observer.Element {
return subject.subscribe(observer)
}
}
作者
stareta1202, [邮箱 protected]
许可证
CoreEngine 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。