2015-05-08 15 views
6

Sto costruendo un'app utilizzando Swift con Core Data. A un certo punto nella mia app, voglio avere un UITableView mostrare tutti gli oggetti di un tipo attualmente nel negozio permanente. Attualmente li sto recuperando e mostrandoli nella vista tabella utilizzando un NSFetchedResultsController. Voglio che la vista tabella per essere ordinata da una proprietà calcolata del mio NSManagedObject sottoclasse, che assomiglia a questo:Ordinamento NSFetchedResultsController di Swift Computed Property su NSManagedObjectSubclass

class MHClub: NSManagedObject{ 
@NSManaged var name: String 
@NSManaged var shots: NSSet 
var averageDistance: Int{ 
    get{ 
     if shots.count > 0{ 
      var total = 0 
      for shot in shots{ 
       total += (shot as! MHShot).distance.integerValue 
      } 
      return total/shots.count 
     } 
     else{ 
      return 0 
     } 
    } 
} 

A mio controller della vista tabella, sto installando l' fetchRequest miei NSFetchedResultsController come segue:

let request = NSFetchRequest(entityName: "MHClub") 
request.sortDescriptors = [NSSortDescriptor(key: "averageDistance", ascending: true), NSSortDescriptor(key: "name", ascending: true)] 

la sua creazione come questo fa sì che la mia applicazione di crash con il seguente messaggio nel registro:

'NSInvalidArgumentException', reason: 'keypath averageDistance not found in entity <NSSQLEntity MHClub id=1>' 

Quando prendo la primo descrittore di ordinamento, la mia app funziona bene, ma la mia vista tabella non è ordinata esattamente come voglio che sia. Come posso ordinare la vista tabella in base a una proprietà calcolata di una sottoclasse NSManagedObject in Swift?

+4

Una richiesta di recupero dei dati principali * non può * ordinare su una proprietà calcolata, solo su proprietà memorizzate persistenti. Confronta (ad esempio) http://stackoverflow.com/questions/13325849/sorting-on-transient-fields-with-nsfetchedresultcontroller. –

+0

Inoltre, il tuo "totale" viene interpretato come int, quindi la media sarà errata. Per esempio. colpi 1,1,3 = 5/3 = 1. – Mundi

risposta

3

Come è stato sottolineato da Martin, non è possibile ordinare su una proprietà calcolata. Basta aggiornare una nuova proprietà memorizzata del club ogni volta che viene scattata una foto.