簡體   English   中英

如何基於REST-ful API中的更改使MVC for iOS應用中的模型動態化?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM