PMVPCoreData 0.5.1

PMVPCoreData 0.5.1

Aubrey Goodman维护。



  • Aubrey Goodman

PMVP是...

  • 一个在您的移动应用中管理数据的框架。
  • 开发人员的工具。
  • 响应式,遵循响应式扩展(Rx)的设计模式。
  • 轻量级且可扩展!

PMVP不是...

  • Core Data的替代品。
  • Realm的替代品。
  • 重量级的。

概述

有关详细信息及其示例,请参阅Motiv Engineering Blog

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

提供者(Provider)

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

Model

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

View

视图组件是简单的UIKit对象,负责向用户表示视图状态。它们还充当用户通过交互式组件与用户界面组件进行交互以更改视图模型状态的机制。如果有的话,视图代理在控制器中定义,并必须转换为视图模型意图。

Presenter

泛型Presenter类定义了配置观察者和绑定以将视图模型状态传达给用户的接口和样板实现。演讲者观察者订阅视图模型的可观察项,以更新文本、图像、视图边界、布局约束等。

开始使用

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)")
  }
}