CoreData Swift e getters de atributos transitórios

Algum conselho sobre a implementação de atributos calculados ao usar o Core Data no Swift?

com a class ManagedObject gerada, tentei sobrescrever o getter, mas recebo o erro:

‘NSManaged’ não permitido em propriedades calculadas

o que implica que você não pode replace o getter por um atributo transitório (calculado).

No exemplo de código abaixo, dateDue é definido como um atributo transitório no meu modelo.

Por favor note que as linhas @NSManaged foram geradas pelo Xcode – não adicionadas por mim.

 @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! } } 

Primeiro, no modelo de dados, crie um atributo transitório ( section ). Por ser transitório, não é fisicamente armazenado e, portanto, não é armazenado no contexto do object gerenciado.

O atributo section é mostrado aqui:

insira a descrição da imagem aqui

A entidade é mostrada aqui:

insira a descrição da imagem aqui

A subclass de class NSManagedObject deve ter calculado o atributo ‘section’. A subclass NSManagedObject demonstrando como realizar isso é mostrada aqui:

 class Number: NSManagedObject { @NSManaged var number: NSNumber var section: String? { return number.intValue >= 60 ? "Pass" : "Fail" } } 

Em seguida, você deve configurar sectionForKeyPath no inicializador NSFetchedResultsController para ser a chave de atributo transitório no modelo de dados e o nome do cache, se desejado.

 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 } 

O resultado é um UITableViewController com notas classificadas por aprovação ou falha dinamicamente:

insira a descrição da imagem aqui

Fiz um projeto de amostra que pode ser encontrado no GitHub .

“Transiente” e “computado” no sentido que você quer dizer são coisas diferentes e são mutuamente exclusivas.

Transiente significa que o valor é armazenado na memory no gráfico do object. Computed significa que o valor é armazenado em nenhum lugar e é calculado no getter. Ambos são distintos do atributo clássico não transitório que é armazenado no gráfico de objects e é salvo em disco.

@NSManaged só pode ser aplicado a atributos que possuem um slot no seu modelo de object gerenciado.

Remova o atributo NSManaged .

Intereting Posts