2014-09-22 4 views
9

che sto cercando di afferrare una miniatura dell'ultima foto scattata su un dispositivo utilizzando il nuovo quadro Foto in iOS 8. Il codice che ho in questo momento per fare questo è la seguente:Come faccio a sapere se un PHAsset in PHFetchResult rappresenta una foto cancellata?

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]; 
              } 
             }]; 

Il codice gestisce per prendere la foto scattata più di recente sul dispositivo, ma se è stata eliminata l'ultima foto scattata sul dispositivo, questo non viene preso in considerazione e l'immagine del pulsante viene impostata sulla foto eliminata nello resultHandler. Questo sembra essere causato dal fatto che in iOS 8, quando si elimina una foto ci vogliono 30 giorni prima che sia effettivamente rimossa dal dispositivo, e per qualche motivo queste foto sono ancora incluse negli PHFetchResult s.

Ho provato a cercare un attributo "cancellato" o simile sugli oggetti PHAsset incluso in assetsInfo, ma non sono riuscito a trovare alcun tipo di informazione. La stampa della fotografia cancellata nel debugger si presenta così:

<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 

La stampa per l'oggetto successivo in assetsInfo, una foto che ho verificato è stato non cancellato, appare così:

<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 

Sembra che non ci siano informazioni che possano dirmi se la foto è stata cancellata. Ho pensato che forse l'attributo hidden sarebbe stato d'aiuto, ma invece ha a che fare con la visualizzazione o meno della foto in determinati album/raccolte Photos.app. Ho pensato che forse l'attributo assetSource potrebbe essere utile, ma non sembra essere documentato, e su ulteriori indagini anche non sembra essere correlato allo stato cancellato della foto.

C'è un modo per vedere se un oggetto PHAsset rappresenta una foto cancellata? C'è un modo per restringere le risorse che sto recuperando per escludere le foto contenute nell'album "Recently Deleted"?

+0

questa sembra un'enorme omissione da parte di Apple –

risposta

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]; 

Il filteredArray non include l'album "Eliminato di recente" e non ha foto identiche. Anche per l'asset fotografico eliminato nel tuo assetInfo, i due seguenti restituiranno NO.

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

In PHAsset Runtime Headers ci sono proprietà utili:

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

Probabilmente non lo userei in produzione, ma +1 per il furbo. –

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

Ciò restituisce la raccolta di tutte le attività eliminati di recente. Puoi eseguire l'iterazione e ottenere PHAsset per tutti gli oggetti in questa raccolta per verificare se il tuo PHAsset è stato eliminato o meno.