2016-08-08 1 views
3

J'ai converti certains PHAsset-UIImage:Comment comparer PHAsset à UIImage

PHImageManager *manager = [PHImageManager defaultManager]; 
      [manager requestImageForAsset:asset 
           targetSize:PHImageManagerMaximumSize 
           contentMode:PHImageContentModeDefault 
            options:requestOptions 
          resultHandler:^void(UIImage *image, NSDictionary *info) { 
           convertedImage = image; 
           [images addObject:convertedImage]; 
          }]; 

Maintenant, je veux faire quelque chose comme ça:

[selectedAssets removeObject:image]; 

selectedAssets est un tableau de PHAsset et image est J'ai donc mis en œuvre le isEqual comme ça:

- (BOOL)isEqual:(id)other { 
    if (other == self) 
     return YES; 
    if (!other || ![[other class] isEqual:[self class]]) 
     return NO; 

    NSData *data1 = UIImagePNGRepresentation(self.image); 
    NSData *data2 = UIImagePNGRepresentation(((TINSelectedImage*)other).image); 

    return [data1 isEqual:data2]; 
} 

Mais cela ne fonctionne pas!

Répondre

6

Vous ne devriez pas comparer les images, vous devriez plutôt comparer les PHAssets ou leur seule partie utile nommée localIdentifier.

La propriété que vous cherchez à distinguer entre les actifs est appelée propriété localIdentifier de PHAsset.

L'Apple Docs définissent comme:

A unique string that persistently identifies the object. (read-only) 

Désolé cette réponse sera un peu large parce que je n'aime pas votre approche ici.

Si je vous, je ferais comme ceci:

d'abord créer une classe personnalisée, Appelons-PhotoInfo. (Vous n'avez pas vraiment besoin de faire cela si vous ne voulez pas garder beaucoup d'informations sur vos photos.Si c'est le cas, utilisez les PFFetchResults de PHAssets directement si vous le souhaitez, mais je vais aller avec CustomClass).

dans PhotoInfo.h:

#import <Foundation/Foundation.h> 
@interface PhotoInfo : NSObject 

@property NSString *localIdentifier; 

@end 

maintenant au lieu d'utiliser un tableau d'images, utilisez cette classe personnalisée créée qui contiendra LocalIdentifier. Comme ceci:

PhotoInfo *photo = [[PhotoInfo alloc] init]; 
photo.localIdentifier = asset.localIdentifier; 

Disons que vous voulez récupérer les images de la galerie, vous feriez quelque chose comme ceci:

-(PHFetchResult*) getAssetsFromLibrary 
{ 
    PHFetchResult *allPhotos; 
    PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init]; 
    allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; //Get images sorted by creation date 

    allPhotos = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:allPhotosOptions]; 

    return allPhotos; 
} 

Pour remplir votre source de données, vous faites quelque chose comme:

NSMutableArray *yourPhotoDataSource = [[NSMutableArray alloc] init]; 
PHFetchResult * assets = [self getAssetsFromLibrary]; 
for(PHAsset *asset in assets) 
     { 
      PhotoInfo *photo = [PhotoInfo new]; 
      photo.localIndentifier = asset.localIdentifier; 
      [yourPhotoDataSource addObject:photo]; 

     } 

Maintenant, disons que vous devez afficher ces images quelque part et vous avez besoin d'une image réelle pour cela, donc vous ferez quelque chose comme ça pour obtenir l'image:

-(void) getImageForAsset: (PHAsset *) asset andTargetSize: (CGSize) targetSize andSuccessBlock:(void (^)(UIImage * photoObj))successBlock { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     PHImageRequestOptions *requestOptions; 

     requestOptions = [[PHImageRequestOptions alloc] init]; 
     requestOptions.resizeMode = PHImageRequestOptionsResizeModeFast; 
     requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat; 
     requestOptions.synchronous = true; 
     PHImageManager *manager = [PHImageManager defaultManager]; 
     [manager requestImageForAsset:asset 
          targetSize:targetSize 
          contentMode:PHImageContentModeDefault 
           options:requestOptions 
         resultHandler:^void(UIImage *image, NSDictionary *info) { 
          @autoreleasepool { 

           if(image!=nil){ 
            successBlock(image); 
           } 
          } 
         }]; 
    }); 

} 

Maintenant que vous affichez ces images dans un tableView, dans votre cellForRowAtIndexPath, appelez la méthode mentionnée ci-dessus comme ceci:

//Show a spinner 
    // Give a customizable size for image. Why load the memory with full image if you don't need to show it? 
[self getImageForAsset:asset andTargetSize:yourDesiredCGSizeOfImage andSuccessBlock:^(UIImage *photoObj) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       //Update UI of cell 
       //Hide the spinner 
       cell.thumbNail.image = photoObj; 
      }); 
     }]; 

Maintenant vous chargement des images de manière asynchrone avec l'expérience utilisateur en douceur et économie de mémoire aussi bien en montrant seulement les images qui sont nécessaires au lieu de tous les stocker. (Vous pouvez améliorer la performance en introduisant la mise en cache, mais ce n'est pas le but ici).

Enfin, pour arriver à votre question, pour supprimer une certaine image, vous aurez seulement besoin de l'identificateur local localIdentifier car il est unique pour chaque PHAsset ou Index. Supposons que vous supprimiez une cellule de votre tableView qui affiche cette image spécifique que vous voulez supprimer.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

if (editingStyle == UITableViewCellEditingStyleDelete) { 
    PhotoInfo *photo = [yourPhotoDataSource objectAtIndex:indexPath.row]; 
    [yourPhotoDataSource removeObject:photo]; 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 


} 
} 

Si vous n'utilisez pas TableView/CollectionView et ne connaissez pas l'index de l'objet, vous pouvez utiliser l'énumération rapide sur votre tableau, mais alors vous devez connaître le LocalIdentifier de l'objet que vous voulez supprimer:

-(void) deletePhotoWithIdentifier:(NSString *) identifierStr{ 
NSMutableArray *dummyArray = [[NSMutableArray alloc] initWithArray:yourPhotoDataSource]; //created because we can't modify the array we are iterating on. Otherwise it crashes. 
[dummyArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(PhotoInfo *p, NSUInteger index, BOOL *stop) { 
    if ([p.localIndentifier isEqualToString:idenfierStr]) { 
     [yourPhotoDataSource removeObjectAtIndex:index]; 
    } 
}]; 

} 
+1

Excellente réponse – iOSGeek

+1

Aussi complète qu'une réponse/exemple que vous (pourriez) avoir besoin. – malaki1974