2016-04-07 17 views
6

Ho un album di immagini gestito da un server remoto. Vorrei dare all'utente un'opzione per scaricare l'album e memorizzarlo in un album personalizzato in Foto. Ma poiché l'album è dinamico (le foto vengono aggiunte ad esso), l'utente può scaricarlo più volte. Non voglio scaricare più volte le stesse immagini, solo quelle nuove.Verifica se l'immagine esiste in Foto

È possibile associare alcuni metadati (ID univoco) quando memorizzo l'immagine nell'app Foto? E poi controlla se quell'immagine esiste già?

Sto utilizzando Photos Framework per creare l'album personalizzato e salvare le foto.

Edit: Ecco il mio codice per creare l'album personalizzato e salvare le foto

/** Returns the first album from the photos app with the specified name. */ 
static func getAlbumWithName(name: String, completion: (album: PHAssetCollection?) -> Void) { 

    let fetchOptions = PHFetchOptions() 
    fetchOptions.predicate = NSPredicate(format: "localizedTitle = %@", name) 
    let fetchResult = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options: fetchOptions) 

    if fetchResult.count > 0 { 

     guard let album = fetchResult.firstObject as? PHAssetCollection else {return} 
     completion(album: album) 

    } else { 

     PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 

      PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(name) 

      }, completionHandler: { (result, error) in 

       if result { 

        FileUtils.getAlbumWithName(name, completion: completion) 

       } else { 

        completion(album: nil) 

       } 


     }) 

    } 

} 

/** Adds an image to the specified photos app album */ 
private static func addImage(image: UIImage, toAlbum album: PHAssetCollection, completion: ((status: Bool) -> Void)?) { 

    PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 

     let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
     let assetPlaceholder = assetRequest.placeholderForCreatedAsset 
     let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: album) 
     albumChangeRequest?.addAssets([assetPlaceholder!]) 


    }) { (status, error) in 

     completion?(status: status) 

    } 

} 
+0

potrebbe essere utile modificare la domanda per mostrare il codice di come si sta scaricando e salvare le foto in questo album personalizzato –

risposta

1

Tutto quello che dovete fare è leggere "localIdentifier" dal segnaposto risorsa. Ho aumentato il codice per restituire l'identificatore nel gestore di completamento. Ti potrebbe piacere trattare questi optional.

private static func addImage(image: UIImage, toAlbum album: PHAssetCollection, completion: ((status: Bool, identifier: String?) -> Void)?) { 

    var localIdentifier: String? 
    PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 

     let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
     let assetPlaceholder = assetRequest.placeholderForCreatedAsset 
     let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: album) 
     albumChangeRequest?.addAssets([assetPlaceholder!]) 
     localIdentifier = assetPlaceholder?.localIdentifier 

    }) { (status, error) in 

     completion?(status: status, identifier: localIdentifier) 

    } 
} 

Quando si desidera leggere di nuovo quel bene il metodo di caricare l'immagine potrebbe apparire qualcosa di simile (non ho usato i vostri convegni o nomi di variabili). Questo leggerà l'asset in modo sincrono ma sono sicuro che puoi individuare l'opzione asincrona.

internal func loadPhoto(identifier: String) -> UIImage? { 
    if assetCollection == nil { 
     return nil 
    } 

    let fetchOptions = PHFetchOptions() 
    fetchOptions.predicate = NSPredicate(format: "localIdentifier = %@", identifier) 
    let fetchResult = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: fetchOptions) 
    if fetchResult.count > 0 { 
     if let asset = fetchResult.firstObject as? PHAsset { 
      let options = PHImageRequestOptions() 
      options.deliveryMode = .HighQualityFormat 
      options.synchronous = true 
      var result: UIImage? 
      PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: CGSize(width: asset.pixelWidth, height: asset.pixelHeight), contentMode: .AspectFit, options: options, resultHandler: {(image: UIImage?, _: [NSObject: AnyObject]?) -> Void in 
       result = image 
      }) 
      return result 
     } 
    } 
    return nil 
}