gpt4 book ai didi

ios - 如何根据 REST-ful API 的变化在 iOS 应用程序的 MVC 中创建动态模型?

转载 作者:搜寻专家 更新时间:2023-11-01 07:10:22 25 4
gpt4 key购买 nike

我们正在构建一个使用 Realm 作为我们的模型/数据库的 iOS 应用程序,但我们希望设计客户端,以便它可以轻松适应将来可能发生的 REST-ful API 更改。假设我们正在为体育比赛组织开发一个应用程序,以适应不同的事件。根据正在进行的运动项目,每个事件都有不同类型的事件类型。目前,API 仅返回 Soccer、Baseball 和 Football,但将来可能会扩展到包括 Basketball。后来它可能会淘汰棒球。我设计了 Realm 对象,以便使用如下一对多关系将事件与事件类型分离:

class EventTypeGroup: Object {
dynamic var name = ""
let eventTypes = List<EventType>()
}

class EventType: Object {
dynamic var name = ""
dynamic var descriptionText = ""
}

EventTypeGroup 是描述事件类型(在本例中为哪些运动)将在事件中进行的类。我使用这种设计是因为 Realm 不支持字典,我们可以在其中存储具有一组关联属性的事件类型。

为了使模型能够适应 API 中 future 的变化,以防添加或删除特定组织的运动,我使用了如下抽象工厂模式。这样一来,如果不使用符合现代 Swift 设计原则的枚举,就无法创建事件。我遇到的问题是,假设我们只在用户打开应用程序时检查事件类型(体育)的 API 更改,我们如何在应用程序已经打开的情况下更改模型?如果这些字段发生变化,是否需要迁移数据库?

protocol EventTypeGroupFactory {

func createEventTypeGroup(List<EventType>) -> EventTypeGroup

}

protocol EventTypeFactory {

func createEventTypes() -> List<EventType>

}

class SportEventGroupFactory: EventTypeGroupFactory {
func createEventTypeGroup(withEventTypes: List<EventType>) ->
EventTypeGroup {
//implement logic to create an EventTypeGroup for the SportEventGroup

}
}

class SportEventTypeFactory: EventTypeFactory {
EventTypeGroup {
func createEventType() -> EventType {
//implement logic to create an EventType for the SportEventType
}
}


class EventTypeGroup: Object {

let eventTypes = List<Int>
enum EventType {
}
}

class EventType: Object {

var type: Int?
name: String?
description: String?
}

class Event: Object {

static enum EventType
init(eventTypeWithRawValue:) {

}
}

此外,如果我不知道如何定义它们,我将如何在我现在编写的代码中引用类的不同变体。我猜想抽象工厂模式可能不是处理这个问题的最佳方式,但我不确定我应该考虑哪些其他选项或如何解决使类型在基于 API 更改的模型中易于扩展的问题。

最佳答案

我认为你过于复杂了。只需将名为“eventType”的字符串属性添加到您的事件模型。

例如,通常情况下,如果您不需要保持动态,您可能会这样做:

enum EventType {
case soccer
case baseball
case football
}

// Your Event model
struct Event {
var date: Date
var eventType: EventType // a static type :)
}

但在您的情况下,您可以这样做:

// Your Event model without any enums
struct Event {
var date: Date
var eventType: String // a dynamic type :(
}

Property eventType 可以是“soccer”或“baseball”或“football”。 (但编译器现在无法帮助您捕获错误。)至于您的持久存储,只需在那里有一个 eventType 类型的字段并存储字符串。

考虑到静态 Swift 的出色表现,动态类型让我感到难过,但它可以满足您的需求。只要确保考虑边缘情况即可。为了不以未定义的行为结束,请提前考虑您的应用程序应该做什么,例如,如果您最终在磁盘上使用您的 REST API 不再支持的事件类型。

例如,假设您有一个 /eventTypes 端点,以便您的应用程序的用户可以添加事件并相应地对其进行分类,并且它一直在返回“足球”、“棒球”和“足球”以及您的用户一直在添加这些类型的事件,并且您一直在将它们存储在磁盘上(在 Realm 或 CoreData 或其他地方)。但有一天后端(或通过后端)有人将“football”重命名为“american football”,希望没有人将“soccer”也重命名为“football”。 (所以现在您无法判断一个东西是否被重命名或删除以及另一个被添加。)然后您是否将您的 /eventTypes 端点返回的事件类型与您在磁盘上找到的内容结合起来?您是否允许用户添加仍然存在于磁盘上但不再受您的 REST API 支持的旧事件类型,或者只显示它们?

对于活跃用户,如果您的后端人员重命名事件类型或删除事件类型(而不是简单地添加它们),您很可能会遇到这些边缘情况。只需与您的利益相关者讨论行为应该是什么。

关于ios - 如何根据 REST-ful API 的变化在 iOS 应用程序的 MVC 中创建动态模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45335354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com