2015-12-12 55 views
2

我是iOS開發新手,正在開發語言閃卡應用程序,向用戶呈現閃存卡,然後用戶可以說他們是否記住它。如果他們點擊「是」,那麼卡會按照各種變量在某個時間返回,如果他們點擊「否」,那麼卡預計會很快回來。 (間隔重複系統)將邏輯放入核心數據模型

我的問題是,當我使用CoreData作爲應用程序的存儲空間時,將放置此調度邏輯的好地方?

這兩個地方我都以爲是:

在NSManagedObject對燒錄卡的子類。

例如,我可以這樣做:

Flashcard : NSManagedObject { 
    ... 
    @NSManaged var nextReview: NSDate? 
    func reschedule() { 
    // logic to assign a new date to nextReview 
    } 
    ... 
} 

,然後在控制器,它可以訪問兩個CoreData(模型)和View我可以簡單地寫:

// When the user has tapped a response: 
flashcard.reschedule() 

我可以看到這種方法的一個好處是,如果必須在不同的控制器中分配新日期,我不必重寫調度邏輯。

或:

計算控制器的新日期,然後更新模型。

FlashcardViewController { 
    ... 
    // When the user has tapped on a response: 
    let newReviewDate = scheduler.calculateNextReviewDate(...) 
    flashcard.nextReview = newReviewDate 
} 

應該重新安排邏輯是什麼,該控制器應負責的,或者是它的東西,該模型應該做的。或者應該CoreData NSManagedObject只是具有驗證getter和setter的數據?有沒有在iOS開發中首選的方法?我想知道是否NSManagedObject子類應該管理自己的邏輯。

作爲一個額外的,但相關的問題,這種類型的事情,決定組織代碼的方式似乎對我來說是一個弱點。有什麼好的資源可以閱讀,以便更多地瞭解這些類型的決策,更重要的是,何時以及爲什麼使用它們是好的/壞的。

回答

0

因爲你提到的原因,我會把邏輯放在模型中。然而,並不是直接將它放在NSManagedObject的子類中,而是爲它創建一個類別,例如, FlashCard+Schedule.swift。這樣,除了你說的優點之外,如果你想重新生成模型,所有的邏輯將仍然在一個單獨的文件中。

編輯:這是一個很好的article覆蓋更高層次的這個話題(架構模式)。

+0

謝謝。那篇文章特別回答了我的很多問題! – oom

+0

歡迎您!如果您覺得有幫助,請接受答案。乾杯! –

+2

xCode 7中的新功能您不需要創建類別(swift中的擴展名),因爲xCode會爲您執行這些類別,只會有您的屬性。你可以把你的邏輯放到你的管理對象中 –

0

既不是模型也不是控制器。這被稱爲業務邏輯。業務邏輯應該放在一個單獨的類中(單一責任)。我寧願選擇具有業務邏輯的服務類,並將模型作爲簡單存儲,並將模型格式化爲UI /視圖。

0

就像一個建議,因爲我最近在Swift中編寫了這樣一個應用程序。

我的解決方案是每張卡都有一個記憶分數,每當它被標記爲「正確」或「不正確」(我也允許「無反應」)時更新它。

接下來挑選卡的邏輯是在一個Dealer單身人士中,這個單身人士可以依靠這些分數來做出有或沒有隨機元素的好選擇。事實上,該算法非常簡單,以至於它已經成爲「交易」視圖控制器的一部分。