Possiedo un progetto in cui è necessario eseguire una richiesta di recupero che ottenga la data "aggiornata" più recente di un'entità Core Data. Quando esamino effettivamente i risultati restituiti dalla mia interrogazione, tuttavia, vedo un comportamento piuttosto strano. Oltre al risultato "corretto" contenente la data, i risultati includono anche una voce di dizionario vuota. Succede ogni volta, indipendentemente da come sono i dati sottostanti. Anche estraneo, se accendo SQL loggando xcode ed eseguo la query registrata sul dll sqllite, produce il risultato corretto senza voci aggiuntive. Non sono abbastanza sicuro di cosa sto facendo male qui, ogni aiuto sarebbe apprezzato.Swift Fetch Request Restituzione di articoli vuoti nei risultati
La funzione che costruisce ed esegue la query:
func queryForContactDate(context:NSManagedObjectContext) -> AnyObject?
{
var expressionDescriptions = [AnyObject]();
let expressionDescription = NSExpressionDescription()
// Name the column
expressionDescription.name = "maxUpdated"
// Use an expression to specify what aggregate action we want to take and
// on which column. In this case max on the update_at column
expressionDescription.expression = NSExpression(format: "@max.updated_at")
// Specify the return type we expect
expressionDescription.expressionResultType = .DateAttributeType
// Append the description to our array
expressionDescriptions.append(expressionDescription)
// Build out our fetch request the usual way
let request = NSFetchRequest(entityName: Contact.entityName())
// Specify we want dictionaries to be returned
request.resultType = .DictionaryResultType
// Hand off our expression descriptions to the propertiesToFetch field.
request.propertiesToFetch = expressionDescriptions
// Our result is going to be an array of dictionaries.
var results:[[String:AnyObject]]?
// Perform the fetch. This is using Swfit 2, so we need a do/try/catch
do {
results = try context.executeFetchRequest(request) as? [[String:AnyObject]]
} catch _ {
// If it fails, ensure the array is nil
results = nil
}
return results![0];
}
Se metto un punto di interruzione alla fine e stampare i risultati che produce:
Printing description of results:
▿ Optional([[:], ["maxUpdated": 2015-12-30 20:05:31 +0000]])
▿ Some : 2 elements
- [0] : 0 elements
▿ [1] : 1 elements
▿ [0] : 2 elements
- .0 : "maxUpdated"
- .1 : 2015-12-30 20:05:31 +0000
È possibile stampare con context.executeFetchRequest (richiesta) è senza cast? È possibile che tu stia lanciando qualcosa che in realtà non è [[String: AnyObject]]. Soprattutto negli angoli dell'API che sono stati portati su Swift ci sono alcune cose strane che vanno avanti con i dizionari/array – tbondwilkinson
Sospetto che tu sia sulla strada giusta ma la stampa non è stata particolarmente illuminante. Ecco cosa ho ottenuto: [{ }, { maxUpdated = "2015-12-30 20:05:31 +0000"; }] – pbuchheit
Quindi vorrei inserire un punto di interruzione nel metodo di recupero e tracciarlo indietro e vedere da dove proviene la richiesta/quando quel dizionario vuoto arriva lì – tbondwilkinson