Поддерживает ли CoreData методы?

#ios #swift #model-view-controller #core-data

Вопрос:

У меня есть класс с атрибутами (var и let) и методами. Для хранения данных я использую UserDefaults и пытаюсь использовать MVC. Теперь я хочу использовать CoreData. Я могу использовать сущность для хранения var, но куда мне поместить методы? Могут ли методы быть помещены в CoreData? Если нет, то где лучше разместить методы и логику работы с переменными? Помогите мне, пожалуйста)

 class Statistics {
    var defaults = UserDefaults.standard
    var completed = 0
    var launched = 0
    var minutes = 0
    var today = 0
    var dateNew = 0
    let calendar = Calendar.current
    
    static var passedSecondsBackground = 0
    static var didBackground = false
    
    enum Keys: String {
        case day = "PMDR.Day"
        case week = "PMDR.Week"
        case month = "PMDR.Month"
        case year = "PMDR.Year"
        case completed = "Completed"
        case launched = "Launched"
        case minutes = "Minutes"
    }
    
    var keyCompleted = Keys.completed.rawValue
    var keyLaunched = Keys.launched.rawValue
    var keyMinutes = Keys.minutes.rawValue
    

    func checkDate(array: Array<Statistics>) {
        for date in array {
            date.dateNew = date.defaults.integer(forKey: "(date)")
            if date.today != date.dateNew {
                date.deleteScore(when: date)
                date.defaults.set(date.today, forKey: "(date)")
                date.dateNew = date.defaults.integer(forKey: "(date)")
            }
        }
    }
    
    func updateScore(array: Array<Statistics>) {
        for date in array {
            date.completed = date.defaults.integer(forKey: date.keyCompleted)
            date.launched = date.defaults.integer(forKey: date.keyLaunched)
            date.minutes = date.defaults.integer(forKey: date.keyMinutes)
        }
    }

    /* etc... */
}
 

Ответ №1:

Есть два варианта.

  • Если классы генерируются Xcode, поместите свою пользовательскую логику в расширения классов.
  • Создайте классы самостоятельно (установив для Codegen значение Вручную/Нет и пункт меню Editor > Create NSManagedObject Subclass). Этот способ сложнее поддерживать, но вы можете настроить подклассы NSManagedObject, заменив необязательные типы необязательными, а тип NSSet отношений-собственным Set

Комментарии:

1. Пожалуйста, скажите мне, могу ли я написать логику для записи и чтения из CoreData прямо в Расширении для этого класса (класс, созданный с помощью CoreData)?

2. Вы должны поместить логику для чтения и записи в класс контроллера.

3. Может быть, вы поможете мне еще с одним вопросом? В VC я запрашиваю методы в расширении (Stat) с помощью «var stat = Stat()» и получаю ошибку: '[error] error: CoreData: error: Failed to call designated initializer on NSManagedObject class 'Stat' CoreData: error: CoreData: error: Failed to call designated initializer on NSManagedObject class 'Stat' ' Методы работают, но получают ошибку