2015-07-21 8 views
11

Come faccio a filtrare per sottotipo multimediale utilizzando NSPredicate con PHFetchOptions? Sto tentando di escludere i video mo mo (alta frequenza di fotogrammi) e time lapse. Continuo a ricevere strani risultati quando provo a utilizzare il campo predicate di PHFetchOptions.Come filtrare per sottotipo di media utilizzando NSPredicate con PHFetchOptions

Il mio telefono ha un numero (120+) di video regolari e un video mo lento. Quando eseguo l'esempio da Apple's docs, ottengo il risultato corretto: 1 mo lento video.

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

Ma sto cercando di escludere lento mo, invece di selezionarlo. Tuttavia, se nego la condizione di filtro, ottengo risultati zero indietro:

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

<PHFetchResult: 0x1702a6660> count=0 

Confusamente, elencare i documenti di Apple il nome del campo come mediaSubtypes (con una "s"), mentre il loro predicato campione sta filtrando su mediaSubtype (senza una "s").

Cercando di filtrare mediaSubtypes produce un errore:

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

nessuno è stato in grado di fare testa o croce di questo predicato?

+0

Più uno. Abbiamo avuto problemi simili. Nessuna correzione ancora. –

+0

stesso problema qui – user1055568

risposta

3

Prima di tutto, lasciatemi dire circa il s in mediaSubtypes accessibile PHAsset e solo foto team di Apple lo sa perché e come mediaSubtype opere senza un s.

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

Ora vorrei provare a spiegare perché non funziona come previsto. Ecco come si confronta usando NS_OPTIONS o qualsiasi altra operazione bit a bit.

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

Ecco come ci si confronta per vedere se un'attività non è uno screenshot-

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

Ora nel tuo caso il predicato deve essere-

  • recuperare tutti i video con elevato frame rate

    [NSPredicate predicateWithFormat:@"((mediaSubtype & %d) == %d)", PHAssetMediaSubtypeVideoHighFrameRate, PHAssetMediaSubtypeVideoHighFrameRate]; 
    
  • Fetch tutti i video senza elevato frame rate

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

Questo funziona meravigliosamente nel mio caso. Spero che aiuti qualcun altro.

+0

Non l'avrei mai capito in un milione di anni. – matt

Problemi correlati