2015-07-21 22 views
11

如何使用NSPredicatePHFetchOptions按媒體子類型進行過濾? 我試圖排除慢鏡頭(高幀率)和時間推移視頻。當我嘗試使用PHFetchOptionspredicate字段時,我總是收到奇怪的結果。如何使用帶有PHFetchOptions的NSPredicate按媒體子類型進行過濾

我的手機有一堆(120多個)普通視頻和一個慢鏡頭視頻。當我從Apple's docs運行示例時,我得到了正確的結果:1個慢速視頻。

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

但我想排除慢莫,而不是選擇它。但是,如果我否定的過濾條件,我得到零個結果反饋:

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

<PHFetchResult: 0x1702a6660> count=0 

令人困惑的是,蘋果的文檔列表字段mediaSubtypes的名稱(以「S」),而他們的樣品謂詞是在mediaSubtype過濾(沒有「s」)。

試圖在mediaSubtypes濾波器產生一個錯誤:

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

有沒有人能夠使這個謂詞的正面還是反面?

+0

加一。我們有類似的問題。還沒有修復。 –

+0

同樣的問題在這裏 – user1055568

回答

3

首先,讓我說一下smediaSubtypes可在PHAsset只有照片的團隊在蘋果知道爲什麼和如何mediaSubtype作品沒有s

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

現在讓我試着解釋爲什麼它不像預期的那樣工作。以下是使用NS_OPTIONS或任何其他按位操作進行比較的方法。

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

這裏是你將如何比較,看看資產不是screenshot-

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

現在你的情況應該謂詞是─

  • 獲取與高幀的所有視頻率

    [NSPredicate predicateWithFormat:@"((mediaSubtype & %d) == %d)", PHAssetMediaSubtypeVideoHighFrameRate, PHAssetMediaSubtypeVideoHighFrameRate]; 
    
  • 取所有視頻沒有高幀率

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

這精美的作品在我的情況。希望它能幫助別人。

+0

我絕不會在一百萬年內想到這一點。 – matt