2014-09-30 1 views
2

photokit 쿼리에 대한 필터를 작성하는 방법, 특히 특정 mediaTypes 만 검색하려는 경우 NSPredicate를 공식화하는 방법을 이해하는 데 많은 어려움을 겪고 있습니다. 필자는 모든 앨범 (즉, PHCollectionAssets)을 검색하려고하는데, 그 앨범에있는 사진 만 원한다. 나는 이것을하기 위해 내 NSPredicate를 공식화하는 방법에 대해 혼란스러워한다. 특정 mediaSubtypes를 필터링하는 문서에서 아래 코드를 발견했지만 PHAssetMediaTypeImage mediaType으로 필터링하려고합니다. 누군가 NSPredicate 코드의 구문을 설명 할 수 있을까요? 그리고 이제는 PHFetchRequest를 충돌시키지 않는 @"mediaType == %@, PHAssetMediaTypeImage" 줄을 따라 술어를 설정할 수 있습니까?Photokit 가져 오기 용 NSPredicate 형식 지정

PHFetchOptions *fetchOptions = [PHFetchOptions new]; 
fetchOptions.predicate = 
    [NSPredicate predicateWithFormat: 
     @"(mediaSubtype & %d) != 0 || (mediaSubtype & %d) != 0", 
     PHAssetMediaSubtypePhotoPanorama, PHAssetMediaSubtypeVideoHighFrameRate]; 
PHFetchResult *fetchResult = [PHAsset fetchAssetsWithOptions:fetchOptions]; 

답변

0

예제는 docs입니다. PHAssetsmediaSubtype으로 필터링합니다. 유형은 PHAssetMediaSubtype이며 열거 형입니다. 논리 AND 연산자를 사용하여 자산의 mediaSubtype이 가능한 하위 유형 중 하나 이상인지 여부를 테스트합니다. 이 예제는 반입에서 반환 된 PHAsset이 파노라마 사진 (PHAssetMediaSubtypePhotoPanorama) 또는 높은 프레임 속도 비디오 (PHAssetMediaSubtypeVideoHighFrameRate)인지 여부를 테스트합니다.

이미지 만 가져 오려면 이미지를 가져와야합니다. 이미지 가져 오기. 모든 애셋을 가져 오지 않고 불필요하므로 mediaSubtype으로 필터링하지 마십시오. 그래서 같은

+ (PHFetchResult *)fetchAssetsWithMediaType:(PHAssetMediaType)mediaType options:(PHFetchOptions *)options; 

:

PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil]; 

이 모든 이미지를 반환합니다

는 방법을 사용해보십시오. 선택적으로 PHFetchOptions을 전달하여 이미지를 필터링하십시오.이 가져 오기에 의해 반환됩니다.

+0

감사합니다. 난 여전히 그룹화하고 반환 된 이미지를 "앨범"으로 tableview에 제시하고 싶습니다. 모든 이미지를 요청할 경우에도이 작업을 수행 할 수 있습니까? – user3719120

+0

[PHAssetCollection fetchAssetCollectionsWithType : PHAssetCollectionTypeAlbum ...]을 사용하여 앨범을 가져온 다음 자산 컬렉션을 매개 변수로 사용하여 [PHAsset fetchAssetsInAssetCollection : ...]을 사용하여 자산을 가져올 수 있습니다. https://developer.apple.com/library/ios/documentation/Photos/Reference/PHAssetCollection_Class/index.html을 참조하십시오. – jlw

3

미세한 차이가있는 것 같습니다. PHAssetMediaSubtype은 비트 마스크 값이고 PHAssetMediaType은 단지 int입니다. 실제로 본질적으로 변경되지는 않지만 술어 해석기는 단순히 비트 AND 연산자 &PHAssetMediaType에 적용하기를 거부합니다. 그 중 하나에 대해서는 일반 항등 연산자 ==을 사용해야합니다. 주어진 컬렉션의 유일한 자산을 원하고 어떤 fetchAssetsInAssetCollection:withMediaType: 방법이 없기 때문에 fetchAssetsWithMediaType 당신을 위해 충분하지 않은 경우

그래서, 당신은 할 수 있습니다 :

PHFetchOptions *fetchOptions = [PHFetchOptions new]; 
fetchOptions.predicate = 
    [NSPredicate predicateWithFormat:@"mediaType == %d", PHAssetMediaTypeImage]; 
PHFetchResult *assetsFetchResult = 
    [PHAsset fetchAssetsInAssetCollection:anAssetCollection options:fetchOptions];