![](/img/trans.png)
[英]IOS to REST-ful MVC Api Service - [Get] works, but parameters don't reach server with [Post]
[英]How do I make model in MVC for iOS app dynamic based on changes in REST-ful API?
我們正在使用Realm作為模型/數據庫來構建iOS應用程序,但我們希望設計客戶端,以便它可以輕松適應將來可能發生的REST-ful API中的更改。 可以說,我們正在為體育比賽組織開發一款可容納各種賽事的應用程序。 每個事件都有不同類型的事件類型,具體取決於所進行的體育運動。 目前,API僅返回“足球”,“棒球”和“足球”,但將來可能會擴展到包括“籃球”。 以后可能會消除棒球。 我已經設計了Realm對象,以便使用如下所示的一對多關系將事件與事件類型分離:
class EventTypeGroup: Object {
dynamic var name = ""
let eventTypes = List<EventType>()
}
class EventType: Object {
dynamic var name = ""
dynamic var descriptionText = ""
}
EventTypeGroup是描述事件類型(在本例中為哪種體育項目)的類,將在該事件中播放。 我之所以使用這種設計,是因為Realm不支持字典,在Realm中我們可以存儲帶有相關屬性集的事件類型。
為了使模型適應API將來的更改,以防添加或刪除特定組織的運動,我使用了如下的抽象工廠模式。 這樣,如果不使用符合現代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 :(
}
然后,屬性eventType
可以是“足球”或“棒球”或“足球”。 (但是編譯器現在無法幫助您捕獲錯誤。)至於持久性存儲,只需在其中有一個eventType
類型的字段並存儲字符串即可。
考慮到靜態Swift的出色表現,動態類型讓我很傷心,但它可以滿足您的需求。 只要確保考慮一些極端情況即可。 為了避免出現不確定的行為,例如,如果您遇到磁盤上的事件類型不再受REST API支持的情況,請考慮一下應用程序應該做什么。
例如,假設您有一個/eventTypes
端點,以便您的應用程序的用戶可以添加事件並進行相應的分類,並且它一直在返回“足球”,“棒球”和“足球”,並且您的用戶一直在添加這些事件類型,您已將它們存儲在磁盤上(在Realm或CoreData中或其他任何形式)。 但是有一天,后端(或通過后端)上的某人將“足球”重命名為“美國足球”,我們希望沒有人也將“足球”重命名為“足球”。 (因此,現在您無法確定某個事物是否已重命名或刪除,以及是否添加了另一個事物。)然后,您是否將/eventTypes
端點返回的事件類型與在磁盤上找到的內容進行並集? 您是否允許用戶添加仍在磁盤上但REST API不再支持的舊事件類型,或者僅顯示它們?
對於活躍的用戶,如果后端人員重命名事件類型或刪除事件類型(而不是簡單地添加事件類型),則可能會遇到這種極端情況。 只需與您的涉眾討論行為應該是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.