PMVP 0.7.1

PMVP 0.7.1

Aubrey Goodman维护。



PMVP 0.7.1

  • Aubrey Goodman, Antony Chuang, Donny Kuang 和 Mimi Chenyao

PMVP 是...

  • 一个用于在移动应用程序中管理数据的框架。
  • 一个面向开发者的工具。
  • 响应式,遵循响应扩展(Rx)设计模式。
  • 轻量且可扩展!

PMVP 不是...

  • Core Data 的替代品。
  • Realm 的替代品。
  • 重型。

概述

有关详细说明和示例,请参阅 Motiv Engineering 博客上的内容

https://medium.com/motiv-engineering-blog/introducing-pmvp-a-reactive-mobile-application-design-pattern-b2216b34ec0c

Provider

通用的 Provider 类定义了用于协调对本地和远程数据存储的访问的接口和样板实现。您负责实现各种特定领域的组件,例如转换器和存储适配器。框架处理所有繁重的工作,使用您的自定义组件。

模型

通用的 ViewModel 类定义了所有 ViewModel 共同的标准行为,包括状态表示和意图处理。视图控制器定义观察者来响应用户操作,通过将它们映射到意图,并将这些意图路由到 ViewModel。所有改变 ViewModel 状态的操作都必须编码为意图。

视图

视图组件是简单的 UIKit 对象,负责向用户展示视图状态。它们还充当用户通过屏幕组件交互来改变 ViewModel 状态的机制。如果有的话,视图代理在控制器中定义,并必须转换为 ViewModel 意图。

展示者

通用的 Presenter 类定义了配置观察者和绑定以将 ViewModel 状态传达给用户的接口和模板实现。展示者观察者订阅 ViewModel 可观察对象以更新文本、图片、视图边界、布局约束等。

开始使用

Podfile

pod 'PMVP', '~> 0.4'

实现所需组件

假设您正在创建一个用于管理项目的类。

class ItemProvider: Provider<...> {

在定义提供者之前,您需要满足其依赖项。您需要为以下内容创建类

  • ItemProxy: 代理(您在应用程序中用于描述项目的轻量级对象)
  • ItemLocal: 本地对象(必须继承自LocalObject;通常是一个Core Data或Realm管理的对象)
  • ItemRemote: 远程对象(必须继承自RemoteObject;定义远程对象模式)
  • ItemLocalConverter: 转换器(在代理和本地对象之间进行转换)
  • ItemRemoteConverter: 转换器(在代理和远程对象之间进行转换)
  • ItemLocalStorage: 本地存储(您自定义的本地数据访问器实现)
  • ItemRemoteStorage: 远程存储(您自定义的远程数据访问器实现)

定义完成后,您可以按如下方式创建提供者类

import PMVP

class ItemProvider: Provider<Int, ItemProxy, ItemLocal, ItemRemote, ItemLocalStorage, ItemRemoteStorage> {
}

用法

监控集合

itemProvider.objects()
   .subscribe(onNext: { items in NSLog("\(items.count) objects") })
   .disposed(by: disposeBag)

监控单个项目

itemProvider.object(for: 127)
   .subscribe(onNext: { item in NSLog(item) })
   .disposed(by: disposeBag)

创建/更新项目

itemProvider.update(item, queue: .main) { result in 
  switch result {
  case .success(let localItem):
    NSLog("item updated \(localItem)")
  case .failure(let error):
    NSLog("failed to update item: \(error)")
  }
}

删除项目

itemProvider.destroy(item, queue: .main) { result in 
  switch result {
  case .success(let localItem):
    NSLog("item deleted \(localItem)")
  case .failure(let error):
    NSLog("failed to delete item: \(error)")
  }
}