【问题标题】:iOS MVP data conversion responsibilityiOS MVP 数据转换责任
【发布时间】:2018-02-01 00:12:59
【问题描述】:

假设我有 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

然后拨打updateUIlike

func updateUI() {
    someLabel.text = presenter.someText
    dateLabel.text = presenter.stringDate
    ..other properties
}

或者甚至可以将两者结合起来,但这听起来很糟糕,因为View 无论如何都会获得Date 属性。

【问题讨论】:

    标签: ios swift architecture mvp


    【解决方案1】:

    视图不应对数据的任何转换和操作负责。 有两种方法可以解决这个问题:

    1. 在模型中创建计算属性或方法并在视图中使用它们。我更喜欢计算属性,因为代码更简洁易懂。
    2. 管理 Presenter 类中的所有转换和操作。 MVP 模式中这个类的目的是获取模型,做一些事情,然后传递最终数据以呈现在视图中。

    这两种方式都是正确的,这取决于上下文。也许第二种方式更接近模式,但这取决于。

    有关计算属性的一些文档: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID259

    【讨论】:

    • 所以你传递了具有date: DatestringDate: String {return ""}两个属性的模型?
    • 是的,正确的方法是在模型中使用私有变量(您的日期)和所有公共计算属性,以访问或修改来自外部类的值。
    【解决方案2】:

    使用 MVP,您希望 Presenter 层为 View 层执行所有自定义显示逻辑,而您不想对 Model 层执行任何操作,它应该只是对象在数据库中定义方式的简单表示) .

    首先我会在一个字符串扩展文件中创建一个自定义初始化,例如

    extension String {
    
       init(from date: Date) {
           // custom logic goes here
       }
    }
    

    然后在你的相关 Presenter 中只有一个属性调用这个扩展类来进行数据操作,这样其他 Presenter 也可以使用这个逻辑,例如

    public class Presenter {
    
        public var customProperty: String {
    
           return String.init(from: model.date)        
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      相关资源
      最近更新 更多