Подтвердить что ты не робот

Получатели CoreData Swift и переходные атрибуты

Любые советы по реализации рассчитанных атрибутов при использовании Core Data в Swift?

с созданным классом ManagedObject, я попытался переопределить getter, но получаю ошибку:

"NSManaged" не разрешен для вычисленных свойств

что означает, что вы не можете переопределить getter для переходного (вычисленного) атрибута.

В приведенном ниже примере кода dateDue определяется как переходный атрибут в моей модели.

Обратите внимание, что @NSManaged строки были созданы Xcode - не добавлены мной.

@NSManaged var timeStamp: NSDate
@NSManaged var dateDue: String { 
    get {

        self.willAccessValueForKey("dateDue")
        var ddtmp  = self.primitiveValueForKey("dateDue") as String?
        self.didAccessValueForKey("dateDue")

        if (ddtmp == nil)
        {

            let calendar = NSCalendar.currentCalendar()

            let components = calendar.components((NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit ) , fromDate: self.timeStamp)
            ddtmp = "\(components.year * 1000 + components.month)"
            self.setPrimitiveValue(ddtmp, forKey: "dateDue")

        }



        return ddtmp!
    }

}
4b9b3361

Ответ 1

Сначала в модели данных создайте переходный атрибут (section). Поскольку он является временным, он физически не хранится и, следовательно, не сохраняется в контексте управляемого объекта.

Атрибут section показан здесь:

enter image description here

Объект показан здесь:

enter image description here

Подкласс класса NSManagedObject должен иметь вычисленный атрибут "section". Подкласс NSManagedObject, демонстрирующий, как это сделать, показан здесь:

class Number: NSManagedObject {

    @NSManaged var number: NSNumber

    var section: String? {
        return number.intValue >= 60 ? "Pass" : "Fail"
    }
}

Затем вы должны установить sectionForKeyPath в инициализаторе NSFetchedResultsController в качестве ключа атрибута переходного процесса в модели данных и имени кеша при желании.

override func viewDidLoad() {
        super.viewDidLoad()

        fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: "section", cacheName: "Root")
        fetchedResultsController?.delegate = self
        fetchedResultsController?.performFetch(nil)

        tableView.reloadData()
}

func fetchRequest() -> NSFetchRequest {

    var fetchRequest = NSFetchRequest(entityName: "Number")
    let sortDescriptor = NSSortDescriptor(key: "number", ascending: false)

    fetchRequest.predicate = nil
    fetchRequest.sortDescriptors = [sortDescriptor]
    fetchRequest.fetchBatchSize = 20

    return fetchRequest
}

В результате получается UITableViewController с оценками, отсортированными по проходу или сбой динамически:

enter image description here

Я сделал пример проекта, который можно найти на GitHub.

Ответ 2

"Переходные" и "вычисленные" в том смысле, что вы имеете в виду разные вещи и являются взаимоисключающими.

Transient означает, что значение хранится в памяти на графике объекта. Вычисление означает, что значение не хранится нигде и рассчитывается в геттере. Оба они отличаются от классического атрибута non-transient, который хранится на графе объектов и сохраняется на диске.

@NSManaged может применяться только к атрибутам, имеющим слот в модели управляемого объекта.

Ответ 3

Удалите атрибут NSManaged.