2014-10-30 19 views
5

In particolare, come è possibile sapere se uno PHAsset ha una versione corrente della risorsa sottostante diversa dall'originale?Come sapere se un PHAsset è stato modificato?

Il mio utente deve solo scegliere tra la risorsa corrente o quella originale quando necessario. E poi ho bisogno della loro risposta per PHImageRequestOptions.version.

risposta

4

Ho trovato due modi di controllare PHAsset per le modifiche e l'ho pubblicato come Gist.

- (void)tb_checkForModificationsWithEditingInputMethodCompletion:(void (^)(BOOL))completion { 
    PHContentEditingInputRequestOptions *options = [PHContentEditingInputRequestOptions new]; 
    options.canHandleAdjustmentData = ^BOOL(PHAdjustmentData *adjustmentData) { return YES; }; 

    [self requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 
     if (completion) completion(contentEditingInput.adjustmentData != nil); 
    }]; 
} 

- (void)tb_checkForModificationsWithAssetPathMethodCompletion:(void (^)(BOOL))completion { 
    PHVideoRequestOptions *options = [PHVideoRequestOptions new]; 
    options.deliveryMode = PHVideoRequestOptionsDeliveryModeFastFormat; 

    [[PHImageManager defaultManager] requestAVAssetForVideo:self options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) { 
     if (completion) completion([[asset description] containsString:@"/Mutations/"]); 
    }]; 
} 

EDIT: ero al punto in cui avevo bisogno la stessa funzionalità per PHAsset con un'immagine. Ho usato questo:

- (void)tb_checkForModificationsWithAssetPathMethodCompletion:(void (^)(BOOL))completion { 
    [self requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 
     NSString *path = (contentEditingInput.avAsset) ? [contentEditingInput.avAsset description] : contentEditingInput.fullSizeImageURL.path; 
     completion([path containsString:@"/Mutations/"]); 
    }]; 
} 
2

Date un'occhiata a PHImageRequestOptionsVersion

PHImageRequestOptionsVersionCurrent

Richiesta la versione più recente del bene dell'immagine (quella che riflette tutte le modifiche). L'immagine risultante è l'output reso da tutte le regolazioni precedentemente apportate.

PHImageRequestOptionsVersionUnadjusted

Richiesta una versione della risorsa immagine senza regolazioni.
Se la risorsa è stata modificata, l'immagine risultante riflette lo stato della risorsa prima dell'esecuzione di eventuali modifiche.

PHImageRequestOptionsVersionOriginal

Richiesta l'originale, la versione più alta fedeltà del bene dell'immagine. L'immagine risultante è originariamente acquisita o importata della risorsa , indipendentemente dalle eventuali modifiche apportate.

Se si chiede all'utente prima di recuperare le risorse, è possibile sapere quale versione è stata specificata dall'utente. Se ottieni un phasset da un'altra posizione, puoi fare un revertAssetContentToOriginal per ottenere la risorsa originale. E PHAsset ha le proprietà modifyDate e creationDate, puoi usare questo per dire se un PHAsset viene modificato.

+0

Ho aggiornato la domanda, ho bisogno delle informazioni per creare * PHImageRequestOptions * correttamente. –

+0

[Documentazione] (https://developer.apple.com/library/IOs/documentation/Photos/Reference/PHAsset_Class/index.html#//apple_ref/occ/instp/PHAsset/modificationDate): 'Photos aggiorna la data di modifica quando l'immagine o il contenuto di un video o i metadati di un bene cambiano. Quindi la data di modifica cambierà anche quando preferite un'immagine. –

+0

Hai fatto un test al riguardo? – gabbler

0

Ho trovato questo codice l'unico a lavorare per ora, e gestisce la maggior parte dei casi limite. Potrebbe non essere il più veloce ma funziona bene per la maggior parte dei tipi di immagini. Prende l'immagine originale e modificata più piccola possibile e confronta il loro contenuto di dati.

@implementation PHAsset (Utilities) 
- (void)checkEditingHistoryCompletion:(void (^)(BOOL edited))completion 
{ 
    PHImageManager *manager = [PHImageManager defaultManager]; 

    CGSize compareSize = CGSizeMake(64, 48); 

    PHImageRequestOptions *requestOptions = [PHImageRequestOptions new]; 
    requestOptions.synchronous = YES; 
    requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat; 
    requestOptions.version = PHImageRequestOptionsVersionOriginal; 

    [manager requestImageForAsset:self 
         targetSize:compareSize 
         contentMode:PHImageContentModeAspectFit 
          options:requestOptions 
        resultHandler:^(UIImage *originalResult, NSDictionary *info) { 

         UIImage *currentImage = originalResult; 

         requestOptions.version = PHImageRequestOptionsVersionCurrent; 

         [manager requestImageForAsset:self 
              targetSize:currentImage.size 
              contentMode:PHImageContentModeAspectFit 
               options:requestOptions 
             resultHandler:^(UIImage *currentResult, NSDictionary *info) { 

              NSData *currData = UIImageJPEGRepresentation(currentResult, 0.1); 
              NSData *orgData = UIImageJPEGRepresentation(currentImage, 0.1); 

              if (completion) { 

               //handle case when both images cannot be retrived it also mean no edition 
               if ((currData == nil) && (orgData == nil)) { 
                completion(NO); 
                return; 
               } 

               completion(([currData isEqualToData:orgData] == NO)); 
              } 
             }]; 
        }]; 
} 

@end 
+0

La soluzione funziona solo per le immagini. Il secondo blocco di codice (quello dopo EDIT) dalla risposta accettata non funziona per te? –

+0

Purtroppo no:/Sto ricevendo un percorso regolare anche dopo la modifica ad esempio: percorso \t NSString * \t @ "/ var/mobile/Media/DCIM/100APPLE/IMG_0736.PNG" \t 0x15d683d0 –

Problemi correlati