Как определить, представляет ли 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 дней, прежде чем она действительно удаляется с устройства, и по какой-то причине эти фотографии все еще включены в PHFetchResult
s.
Я пытался найти "удаленный" или похожий атрибут на 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 { }