CoreEngine 1.0.3

CoreEngine 1.0.3

stareta1202维护。



CoreEngine

CI Status Version License Platform

简单轻盈

imageCore是通过受ReactorKitRedux启发而创建的更响应式应用的框架。

可扩展性

Core是一个独立的事件驱动框架,这意味着您可以选择导入任何您想要的功能,例如CombineRxSwift等。

其架构非常轻量级和简单,因此您可以选择使用CocoaPods或SPM来保持更新,或者直接将它们拖入您的项目中即可使用。或者,您可以仔细查看代码,自己进行修改。

安装

CoreEngine可以通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中

pod 'CoreEngine'

性能

Screenshot 2023-04-28 at 1 39 26 PM

与类似的框架相比,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 文件。