iOS MVP数据转换责任
iOS MVP data conversion responsibility
假设我有 class 和 Date
属性
class SomeModel {
..some properties
let date: Date = Date(timeIntervalSince1970: 1505050)
..more properties
}
我需要使用此转换(或任何其他转换,仅举个例子)来显示它
func createString(from date: Date) -> String {
let formatter = DateFormatter()
formatter.dateFormat = "MM dd yyyy HH:mm:ss"
let stringifyDate = formatter.string(from: model.applicationDate)
let monthSymbols = formatter.shortMonthSymbols
let monthIndex = Calendar.current.component(.month, from: model.applicationDate)
let monthName = monthSymbols![monthIndex-1]
return monthName + String(stringifyDate.dropFirst(2))
}
使用 Model-View-Presenter 模式,我是否应该将 SomeModel
传递给 View
并在那里执行转换,因为其他属性是String
/Int
并且很容易显示它们。或者我应该为每个 SomeModel
字段
创建属性
var someText: String {
return model.someText
}
var stringDate: String {
return createString(from: model.date)
}
..other properties
然后像
一样调用updateUI
func updateUI() {
someLabel.text = presenter.someText
dateLabel.text = presenter.stringDate
..other properties
}
甚至可以将两者结合起来,但这听起来像是个坏主意,因为 View
无论如何都会得到 Date
属性。
视图不应负责任何数据转换和操作。
有两种可能的方法来解决这个问题:
- 在模型中创建计算属性或方法,并在视图中使用它们。我更喜欢计算属性,因为代码更简洁易懂。
- 管理 Presenter 中的所有转换和操作 class。 class 在 MVP 模式中的目的是采用模型,做一些事情,并传递要在视图中呈现的最终数据。
两种方式都对,要看上下文。也许第二种方式更接近模式,但这取决于。
对于 MVP,您希望 Presenter 层为 View 层执行所有自定义显示逻辑,而您不想对 Model 层执行任何操作,它应该只是简单地表示如何在数据库)。
首先我会在字符串扩展文件中创建一个自定义初始化,例如
extension String {
init(from date: Date) {
// custom logic goes here
}
}
然后在您的相关 Presenter 中有一个 属性 调用此扩展 class 来进行数据操作,这样其他演示者也可以使用此逻辑,例如
public class Presenter {
public var customProperty: String {
return String.init(from: model.date)
}
}
假设我有 class 和 Date
属性
class SomeModel {
..some properties
let date: Date = Date(timeIntervalSince1970: 1505050)
..more properties
}
我需要使用此转换(或任何其他转换,仅举个例子)来显示它
func createString(from date: Date) -> String {
let formatter = DateFormatter()
formatter.dateFormat = "MM dd yyyy HH:mm:ss"
let stringifyDate = formatter.string(from: model.applicationDate)
let monthSymbols = formatter.shortMonthSymbols
let monthIndex = Calendar.current.component(.month, from: model.applicationDate)
let monthName = monthSymbols![monthIndex-1]
return monthName + String(stringifyDate.dropFirst(2))
}
使用 Model-View-Presenter 模式,我是否应该将 SomeModel
传递给 View
并在那里执行转换,因为其他属性是String
/Int
并且很容易显示它们。或者我应该为每个 SomeModel
字段
var someText: String {
return model.someText
}
var stringDate: String {
return createString(from: model.date)
}
..other properties
然后像
一样调用updateUI
func updateUI() {
someLabel.text = presenter.someText
dateLabel.text = presenter.stringDate
..other properties
}
甚至可以将两者结合起来,但这听起来像是个坏主意,因为 View
无论如何都会得到 Date
属性。
视图不应负责任何数据转换和操作。 有两种可能的方法来解决这个问题:
- 在模型中创建计算属性或方法,并在视图中使用它们。我更喜欢计算属性,因为代码更简洁易懂。
- 管理 Presenter 中的所有转换和操作 class。 class 在 MVP 模式中的目的是采用模型,做一些事情,并传递要在视图中呈现的最终数据。
两种方式都对,要看上下文。也许第二种方式更接近模式,但这取决于。
对于 MVP,您希望 Presenter 层为 View 层执行所有自定义显示逻辑,而您不想对 Model 层执行任何操作,它应该只是简单地表示如何在数据库)。
首先我会在字符串扩展文件中创建一个自定义初始化,例如
extension String {
init(from date: Date) {
// custom logic goes here
}
}
然后在您的相关 Presenter 中有一个 属性 调用此扩展 class 来进行数据操作,这样其他演示者也可以使用此逻辑,例如
public class Presenter {
public var customProperty: String {
return String.init(from: model.date)
}
}