2015-07-21 6 views
11

Wie filtere ich nach Medien Subtype mit NSPredicate mit PHFetchOptions? Ich versuche, langsam mo (hohe Bildrate) und Zeitraffer Videos auszuschließen. Ich bekomme immer seltsame Ergebnisse, wenn ich versuche, das predicate Feld von PHFetchOptions zu verwenden.Wie Filtern nach Medien Subtyp mit NSPredate mit PHFetchOptions

Mein Telefon hat eine Reihe (120+) regelmäßige Videos und ein langsames MO-Video. Wenn ich das Beispiel von Apple's docs starte, bekomme ich das korrekte Ergebnis zurück: 1 langsame Videoaufnahme.

PHFetchOptions *options = [PHFetchOptions new]; 
options.predicate = [NSPredicate predicateWithFormat:@"(mediaSubtype & %d) != 0 || (mediaSubtype & %d) != 0", PHAssetMediaSubtypeVideoTimelapse, PHAssetMediaSubtypeVideoHighFrameRate]; 

Aber ich versuche zu ausschließen langsam mo, anstatt sie wählen. Allerdings, wenn ich die Filterbedingung negieren, bekomme ich null Treffer:

options.predicate = [NSPredicate predicateWithFormat:@"(mediaSubtype & %d) == 0", PHAssetMediaSubtypeVideoHighFrameRate]; 

<PHFetchResult: 0x1702a6660> count=0 

Verwirrend, die Apple-docs den Namen des Feldes als mediaSubtypes Liste (mit einem „s“), während ihre Probe Prädikat filtert auf mediaSubtype (ohne ein "s").

auf mediaSubtypes filtern Der Versuch, erzeugt einen Fehler:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't do bit operators on non-numbers' 

Hat jemand in der Lage gewesen, Kopf oder Zahl dieses Prädikat zu machen?

+0

Plus eins. Wir hatten ähnliche Probleme. Noch keine Lösung. –

+0

das gleiche Problem hier – user1055568

Antwort

3

Zunächst einmal möchte ich sagen, über das s in mediaSubtypes auf PHAsset und nur Fotos Team bei Apple weiß, warum und wie mediaSubtype Arbeiten ohne s.

@property (nonatomic, assign, readonly) PHAssetMediaType mediaType; 
@property (nonatomic, assign, readonly) PHAssetMediaSubtype mediaSubtypes; 

Jetzt lassen Sie mich versuchen zu erklären, warum es nicht wie erwartet funktioniert. So vergleichen Sie die Verwendung von NS_OPTIONS oder einer anderen bitweisen Operation.

PHAsset* asset = // my asset; 
if((asset.mediaSubtypes & PHAssetMediaSubtypePhotoScreenshot) == PHAssetMediaSubtypePhotoScreenshot) { 
    // This is a screenshot 
} 

Hier ist, wie Sie sich zu vergleichen, um zu sehen, ob Asset keinen screenshot- ist

PHAsset* asset = // my asset; 
if(!((asset.mediaSubtypes & PHAssetMediaSubtypePhotoScreenshot) == PHAssetMediaSubtypePhotoScreenshot)) { 
// This is not a screenshot 
} 

Jetzt in Ihrem Fall das Prädikat

  • Liefern alle Videos mit hohem Frame BE- sollte bewerten

    [NSPredicate predicateWithFormat:@"((mediaSubtype & %d) == %d)", PHAssetMediaSubtypeVideoHighFrameRate, PHAssetMediaSubtypeVideoHighFrameRate]; 
    
  • Liefert alle Videos ohne hohe Bildrate

    [NSPredicate predicateWithFormat:@"!((mediaSubtype & %d) == %d)", PHAssetMediaSubtypeVideoHighFrameRate, PHAssetMediaSubtypeVideoHighFrameRate]; 
    

Dies funktioniert wunderbar in meinem Fall. Hoffe es hilft jemand anderem.

+0

Ich hätte das in einer Million Jahren nie herausgefunden. – matt