2014-09-22 54 views
9

我試圖搶在iOS版8.我現在所擁有的做到這一點的代碼使用新的照片框架的設備上拍攝的最後一張照片的縮略圖如下:如何確定PHFetchResult中的PHAsset是否代表已刪除的照片?

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中。

我試圖尋找包含在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對象是否代表已刪除的照片?有沒有辦法縮小我提取的資源以排除「最近刪除」相冊中包含的照片?

+0

這似乎是蘋果的一部分的一個巨大的遺漏 – 2016-02-27 11:35:22

回答

8
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

我可能不會在生產中使用這個,但爲聰明+1。 – 2014-11-14 16:26:39

0
PHFetchResult * recentlyDeletedAlbum = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:1000000201 options:nil]; 

這將返回所有最近刪除的資產的集合。您可以迭代並獲取此集合中所有對象的PHAsset,以檢查您的PHAsset是否已被刪除。