【问题标题】:How do I determine if a PHAsset in a PHFetchResult represents a deleted photo?如何确定 PHFetchResult 中的 PHAsset 是否代表已删除的照片?
【发布时间】:2014-11-17 00:16:04
【问题描述】:

我正在尝试使用 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 中。

我试图在assetsInfo 中包含的PHAsset 对象上查找“已删除”或类似属性,但我找不到任何类型的信息。调试器中已删除照片的打印输出如下所示:

<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 对象是否代表已删除的照片?有没有办法缩小我要提取的资产范围,以排除“最近删除”相册中包含的照片?

【问题讨论】:

  • 这似乎是苹果公司的一大疏忽

标签: ios photokit phasset


【解决方案1】:
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];

filteredArray 不包括“最近删除”相册,也没有外观相同的照片。同样对于你 assetsInfo 中被删除的照片资产,下面两个会返回 NO。

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

PHAsset Runtime Headers 中有一些有用的属性:

@property (getter=isTrashed, nonatomic, readonly) bool trashed;
@property (nonatomic, readonly) NSDate *trashedDate;

【讨论】:

  • 我可能不会在生产中使用它,但是 +1 给聪明人。
【解决方案2】:
PHFetchResult * recentlyDeletedAlbum = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:1000000201 options:nil];

这将返回所有最近删除的资产的集合。您可以迭代并获取此集合中所有对象的 PHAsset,以检查您的 PHAsset 是否已被删除。

【讨论】:

    【解决方案3】:

    没有属性指示是否删除了阶段集
    它对我有用的唯一方法是再次检查 PHAssetLocalID

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多