2013-07-29 7 views
5

NSOrderedSets salvare l'ordine degli oggetti nella tabella. Se si accede a un'istanza di sottoclasse NSManagedObject con una proprietà che è un NSOrderedSet, allora saranno in ordine.come ordinare i risultati di una NSFetchedResultsController utilizzando l'ordine di un NSOrderedSet

Tuttavia, non c'è apparentemente alcun modo per accedere a tale fine utilizzando un NSSortDescriptor quando si crea un NSFetchRequest.

Risulta dal grezzo SQLite DB, che l'ordine è memorizzato in campi denominati Z_FOK_<relationship name>. I dati sono disponibili, ma non sembrano essere visibili attraverso le API dei dati di base.

Qualcuno conosce un modo per scrivere un NSSortDescriptor che funzioni con un DB SQLite per restituire i risultati nell'ordine specificato da NSOrderedSet?


Aggiornamento

questione connessa: NSFetchedResultsController and NSOrderedSet relationships

risposta

3

Non credo che sia possibile. L '"ordinamento" è associato alla relazione to-many da un'entità A a un'altra entità B, non è una proprietà dell'entità target B. Ma un descrittore di ordinamento per una richiesta di recupero dei dati di base può solo utilizzare le proprietà (persistenti) dell'entità.

+1

Questo sembra essere quello che vedo troppo ... io proprio non riuscivo a credere che non ci sia qualche supporto speciale per questo in modo che NSSortDescriptor NSFetchedResultsControllers possono usufruire dell 'ordine. Altrimenti, gli sviluppatori hanno ancora bisogno di aggiungere e gestire manualmente una proprietà "sortOrder" - che è una sorta di sviamento dello scopo di NSOrderedSet. –

+0

@CoreyFloyd: Si noti che si possono avere due rapporti ordinati 'A1 <-->> B' e' A2 <-->> B' completamente diversi ordinamenti degli oggetti 'B', così "recupero di oggetti b ordinati secondo il rapporto ordinato" sarebbe comunque ambiguo. –

+0

NSFetchRequest deve essere creato con un descrittore di ordinamento. Ma se ci fosse un modo per crearlo senza un descrittore di ordinamento (usando una categoria, una sottoclasse, ecc ...), forse, quando avevi eseguito la richiesta di recupero, l'impostazione predefinita sarebbe NSOrderedSet. Molto probabilmente sarebbe solo un comportamento indefinito, ma potrebbe valerne la pena. –

0

Ho provato questo in rapido solo ora e sembrava funzionare per me.

var sectionsExcludingEmpty: [SurveyAnswerSection] { 
    let fetchRequest: NSFetchRequest<SurveyAnswerSection> = NSFetchRequest.init(entityName: "SurveyAnswerSection") 
    fetchRequest.predicate = NSPredicate.init(format: "surveyAnswer == %@ AND hidden == FALSE", self) 
    fetchRequest.sortDescriptors = [ NSSortDescriptor(key: "surveyAnswer", ascending: true) ] 
    if let moc = self.managedObjectContext { 
     do { 
      let results = try moc.fetch(fetchRequest) 
      return results 
     } catch { 
      fatalError("Could not get sectionsExcludingEmpty: \(error)") 
     } 
    } else { 
     fatalError("Unable to get own managed object context") 
    } 
} 

Quando ho perso fuori dalla linea fetchRequest.sortDescriptors = [ NSSortDescriptor(key: "surveyAnswer", ascending: true) ] ha ordinato apparentemente in modo casuale, ma con la linea aggiunse ordinati come previsto.

Nel mio caso SurveyAnswerSection ha un uno a ordinata-molti con SurveyAnswer.