Как определить, представляет ли PHAsset в PHFetchResult удаленную фотографию?

Я пытаюсь получить эскиз последней фотографии, сделанной на устройстве, используя новую платформу Photoshop в iOS 8. Код, который у меня есть сейчас, чтобы сделать это, заключается в следующем:

PHFetchOptions *fetchOptions = [PHFetchOptions new];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
PHFetchResult *assetsInfo = [PHAsset fetchAssetsWithOptions:fetchOptions];

PHImageRequestOptions *requestOptions = [PHImageRequestOptions new];
requestOptions.version = PHImageRequestOptionsVersionCurrent;
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
[[PHImageManager defaultManager] requestImageForAsset:[assetsInfo objectAtIndex:1]
                                           targetSize:CGSizeMake(100, 100)
                                          contentMode:PHImageContentModeAspectFill
                                              options:requestOptions
                                        resultHandler:^(UIImage *result, NSDictionary *info) {
                                            if (result) {
                                                // galleryButton is just a UIButton in the view
                                                [galleryButton setImage:result forState:UIControlStateNormal];
                                            }
                                        }];

Коду удается захватить самую последнюю сделанную фотографию на устройстве, но если последняя фотография, сделанная на устройстве, была удалена, этот факт не учитывается, и изображение кнопки устанавливается на удаленную фотографию в resultHandler, По-видимому, это связано с тем, что в iOS 8 при удалении фотографии требуется 30 дней, прежде чем она действительно удаляется с устройства, и по какой-то причине эти фотографии все еще включены в PHFetchResults.

Я пытался найти "удаленный" или похожий атрибут на PHAsset объекты, включенные в assetsInfo, но я не смог найти никакой информации. Распечатка удаленной фотографии в отладчике выглядит следующим образом:

<PHAsset: 0x57462a0> 7689FC1C-9EE2-4FF7-9B37-4A032A3FDA01/L0/001 mediaType=1/0, assetSource=2, (1536x2048), creationDate=2014-09-22 06:45:10 +0000, location=1, hidden=0, favorite=0

Распечатка для следующего объекта в assetsInfoфотография, которую я подтвердил, не была удалена, выглядит так:

<PHAsset: 0x57461a0> E48D1482-395B-405C-85F9-FFD04D9EBFBD/L0/001 mediaType=1/0, assetSource=3, (2448x3264), creationDate=2014-09-21 04:24:55 +0000, location=0, hidden=0, favorite=0

Там, кажется, нет никакой информации, которая могла бы сказать мне, была ли фотография удалена. Я думал, что, возможно, hidden атрибут может помочь, но вместо этого это связано с тем, отображается ли фотография в определенных альбомах / коллекциях Photos.app. Я думал, что, возможно, assetSource Атрибут может быть полезен, но он, похоже, не задокументирован, и при дальнейшем исследовании также, похоже, не связан с удаленным статусом фотографии.

Есть ли способ увидеть, если PHAsset объект представляет собой удаленную фотографию? Есть ли способ сузить ресурсы, которые я собираю, чтобы исключить фотографии, содержащиеся в альбоме "Недавно удаленные"?

2 ответа

PHFetchResult *fetchResults = [PHAsset fetchAssetsWithOptions:options];
NSArray* tempArray = [fetchResults objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, fetchResults.count)]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"description contains %@",@"assetSource=3"];
NSArray *filteredArray =  [tempArray filteredArrayUsingPredicate:predicate];

Фильтрованный массив не содержит альбом "Недавно удаленные" и не имеет идентично выглядящих фотографий. Также для удаленного фото актива в ваших assetsInfo, следующие два вернут НЕТ.

[asset canPerformEditOperation:PHAssetEditOperationContent] 
[asset canPerformEditOperation:PHAssetEditOperationProperties]

В PHAsset Runtime Headers есть полезные свойства:

@property (getter=isTrashed, nonatomic, readonly) bool trashed;
@property (nonatomic, readonly) NSDate *trashedDate;
PHFetchResult * recentlyDeletedAlbum = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:1000000201 options:nil];

Это возвращает коллекцию всех недавно удаленных активов. Вы можете выполнить итерацию и получить PHAsset для всех объектов в этой коллекции, чтобы проверить, был ли удален ваш PHAsset или нет.

Нет свойства, указывающего, удален ли фазсет или нет,
единственный способ, которым он работал для меня, - это снова проверить с помощью PHAssetLocalID.

if PHAsset.fetchAssets(withLocalIdentifiers: [pHAsset.localIdentifier], options: .none).count == 0 { }

Другие вопросы по тегам