2016-12-12 3 views
0

Je suis prêt à commander mes résultats par jour afin que les photos les plus anciennes soient affichées en haut.PHFetchResult tri personnalisé: les articles classés par jour, les photos les plus anciennes en premier

Je photos à l'aide actuellement aller chercher le PHAsset fetchAssetsWithMediaType:

@property PHFetchResult *photos; 

self.photos = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil]; 

Idéalement je veux les résultats ordonnés par jour, les plus anciennes photos en premier. Comme ceci:

[11 Dec] 
Photo #20 with creation time 17:00 
Photo #21 with creation time 18:30 
Photo #22 with creation time 19:00 
Photo #23 with creation time 20:40 
Photo #24 with creation time 21:00 
[10 Dec] 
Photo #16 with creation time 10:30 
Photo #17 with creation time 11:00 
Photo #18 with creation time 12:20 
Photo #19 with creation time 13:00 
[9 Dec] 
Photo #14 with creation time 16:30 
Photo #15 with creation time 17:00 

Je l'ai vu je peux passer un PHFetchOptions objet avec un prédicat et des descripteurs de tri (https://developer.apple.com/reference/photos/phfetchoptions), pouvez-vous me suggérer comment les spécifier (je crois que je devrais les trier en utilisant l'attribut creationDate) pour que j'obtienne l'ordre désiré?

Répondre

0

PHFetchOptions accepte sortDescriptors, mais il ne tient pas compte des comparaisons personnalisées (je crois, car il fait tout simplement une requête SQL) comme écrit ici (https://developer.apple.com/reference/photos/phfetchoptions/1624771-sortdescriptors):

Photos ne ne prend pas en charge les descripteurs de tri créés avec sortDescriptorWithKey: ascendant: comparateur: méthode.

La réponse est que vous devez déplacer les résultats dans une nouvelle NSArray puis les commander après les chercher:

- (void)loadPhotos 
{ 
    PHFetchResult *photosResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil]; 

    self.photos = [@[] mutableCopy]; 
    for(PHAsset *asset in photosResult){ 
     [self.photos addObject:asset]; 
    } 
    [self.photos sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" 
                     ascending:YES 
                    comparator:^NSComparisonResult(NSDate *dateTime1, NSDate *dateTime2) { 
                     unsigned int flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; 
                     NSCalendar* calendar = [NSCalendar currentCalendar]; 

                     NSDateComponents* components1 = [calendar components:flags fromDate:dateTime1]; 
                     NSDate* date1 = [calendar dateFromComponents:components1]; 

                     NSDateComponents* components2 = [calendar components:flags fromDate:dateTime2]; 
                     NSDate* date2 = [calendar dateFromComponents:components2]; 

                     NSComparisonResult comparedDates = [date1 compare:date2]; 
                     if(comparedDates == NSOrderedSame) 
                     { 
                      return [dateTime2 compare:dateTime1]; 
                     } 
                     return comparedDates; 
                    } 
             ]]]; 

} 

Je n'ai pas testé cette solution avec un rouleau énorme de la caméra (le tri est ici fait en mémoire et cela peut être un goulot d'étranglement de performance), mais j'espère que cela peut aider.

3

Vous devez utiliser PHFetchOptions

PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; 
    fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:true]]; 
    PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions]; 
+0

merci, mais ce n'est pas l'ordre que je demandais, j'ai besoin des résultats classés par jour (date de création descendante), les photos les plus anciennes en premier (donc l'heure de création ascendant) –

+0

OMG .. laissez-moi essayer –