2015-07-21 15 views
11

Làm cách nào để lọc theo loại phương tiện truyền thông sử dụng NSPredicate với PHFetchOptions? Tôi đang cố loại trừ các tốc độ chậm (tốc độ khung hình cao) và thời gian trôi đi. Tôi tiếp tục nhận được kết quả lạ khi tôi cố gắng sử dụng trường predicate của PHFetchOptions.Làm cách nào để lọc theo loại phương tiện truyền thông bằng cách sử dụng NSPredicate với PHFetchOptions

Điện thoại của tôi có một (120+) video thông thường và một video mo chậm. Khi tôi chạy ví dụ từ Apple's docs, tôi nhận được kết quả chính xác về sau: 1 video chậm chạp.

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

Nhưng tôi đang cố gắng loại trừ làm chậm, thay vì chọn nó. Tuy nhiên nếu tôi phủ nhận điều kiện lọc, tôi nhận được không có kết quả lại:

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

<PHFetchResult: 0x1702a6660> count=0 

gây nhầm lẫn, các tài liệu của Apple liệt kê tên của các lĩnh vực như mediaSubtypes (với một "s"), trong khi vị mẫu của họ được lọc theo mediaSubtype (không có "s").

Đang cố gắng để lọc trên mediaSubtypes tạo ra một lỗi:

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

Có ai đã có thể làm cho người đứng đầu hoặc đuôi của vị này?

+0

Cộng một. Chúng tôi đã có vấn đề tương tự. Chưa sửa chữa. –

+0

cùng một vấn đề ở đây – user1055568

Trả lời

3

Trước hết, hãy để tôi nói về s trong mediaSubtypes sẵn trên PHAsset và chỉ hình ảnh đội tại Apple biết lý do tại sao và làm thế nào mediaSubtype công trình mà không có một s.

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

Bây giờ hãy để tôi giải thích lý do tại sao nó không hoạt động như mong đợi. Đây là cách bạn so sánh bằng cách sử dụng NS_OPTIONS hoặc bất kỳ hoạt động bitwise nào khác.

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

Đây là cách bạn sẽ so sánh để xem nếu tài sản không phải là một screenshot-

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

Bây giờ trong trường hợp của bạn vị nên be-

  • Fetch tất cả video với khung hình cao rate

    [NSPredicate predicateWithFormat:@"((mediaSubtype & %d) == %d)", PHAssetMediaSubtypeVideoHighFrameRate, PHAssetMediaSubtypeVideoHighFrameRate]; 
    
  • Fetch tất cả các video mà không cần tốc độ khung hình cao

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

này làm việc tuyệt vời trong trường hợp của tôi. Hy vọng nó sẽ giúp ai đó khác.

+0

Tôi sẽ không bao giờ tìm ra điều này trong một triệu năm. – matt

Các vấn đề liên quan