2015-05-08 12 views
6

Ich baue eine App mit Swift mit Core Data. An einer Stelle in meiner App möchte ich eine UITableView zeigen alle Objekte eines Typs derzeit im Persistent Store. Momentan lade ich sie ab und zeige sie in der Tabelle mit einem NSFetchedResultsController. Ich möchte die Tabellenansicht durch eine berechnete Eigenschaft meiner NSManagedObject Unterklasse sortiert werden, die wie folgt aussieht:Sortieren NSFetchedResultsController von Swift Berechnete Eigenschaft auf 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 
     } 
    } 
} 

In meinem Tisch View-Controller, Ich gründe meine NSFetchedResultsController ‚s fetchRequest sich wie folgt zusammen:

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

it up wie diese Einstellung bewirkt, dass meine Anwendung mit der folgenden Meldung im Protokoll zum Absturz:

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

Als ich das herausnehmen erster Sortierdeskriptor, meine App läuft gut, aber meine Tabellenansicht ist nicht genau so sortiert, wie ich es möchte. Wie kann ich meine Tabellenansicht basierend auf einer berechneten Eigenschaft einer Unterklasse in Swift sortieren?

+4

Eine Anforderung zum Abrufen von Core-Daten * kann nicht nach einer berechneten Eigenschaft sortiert werden, sondern nur nach persistent gespeicherten Eigenschaften. Vergleichen Sie zum Beispiel http://stackoverflow.com/questions/13325849/sorting-on-transient-fields-with-nfetchedresultcontroller. –

+0

Außerdem wird Ihr "total" als int interpretiert, so dass der Durchschnitt falsch ist. Z.B. Schüsse 1,1,3 = 5/3 = 1. – Mundi

Antwort

3

Wie von Martin darauf hingewiesen wurde, kann nicht nach einer berechneten Eigenschaft sortiert werden. Aktualisieren Sie einfach jedes Mal, wenn eine Aufnahme gemacht wird, eine neue gespeicherte Eigenschaft des Clubs.

Verwandte Themen