Il metodo consigliato è quello di utilizzare Apple Recommended Method NSExpression. Mi aspetterei che questo sarebbe meno costoso rispetto all'utilizzo di un ordinamento. Se ci pensate, con una specie dovrete prendere tutti i record per ordinarli e mantenere il massimo. Con un'espressione dovresti solo leggere l'elenco e mantenere in memoria il massimo.
Ecco un esempio che uso con NSDate
- (NSDate *)lastSync:(PHAssetMediaType)mediaType {
NSEntityDescription *entity = [NSEntityDescription entityForName:kMediaItemEntity inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = entity;
fetchRequest.resultType = NSDictionaryResultType;
NSMutableArray *predicates = [NSMutableArray array];
[predicates addObject:[NSPredicate predicateWithFormat:@"%K=%d", kMediaType,mediaType]];
[predicates addObject:[NSPredicate predicateWithFormat:@"%K=%d", kMediaProviderType,self.mediaProviderType]];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates: predicates];
fetchRequest.predicate = predicate;
// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:kSyncTime];
// Create an expression to represent the function you want to apply
NSExpression *maxExpression = [NSExpression expressionForFunction:@"max:"
arguments:@[keyPathExpression]];
// Create an expression description using the maxExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"maxDate"];
[expressionDescription setExpression:maxExpression];
[expressionDescription setExpressionResultType:NSDateAttributeType];
// Set the request's properties to fetch just the property represented by the expressions.
fetchRequest.propertiesToFetch = @[expressionDescription] ; // @[kSyncTime];
NSError *fetchError = nil;
id requestedValue = nil;
// fetch stored media
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
if (fetchError || results == nil || results.count == 0) {
return [NSDate dateWithTimeIntervalSince1970:0];
}
requestedValue = [[results objectAtIndex:0] valueForKey:@"maxDate"];
if (![requestedValue isKindOfClass:[NSDate class]]) {
return [NSDate dateWithTimeIntervalSince1970:0];
}
DDLogDebug(@"sync date %@",requestedValue);
return (NSDate *)requestedValue;
}
fonte
2015-10-15 07:49:36
grazie del vostro aiuto – Eyal
Se non si dispone di un indice per l'attributo di essere ordinati, allora questa tecnica è più costoso, O (n log n), che la scansione di una lista per un valore massimo, O (n), come descritto nella risposta di @ Uilleann. Detto questo, se hai un indice sull'attributo che viene ordinato, allora entrambe le tecniche dovrebbero essere le stesse. –
Vale la pena anche impostare 'fetchBatchSize' su 1, o è implicito in' fetchLimit' essere 1? – Benjohn