2015-04-24 200 views
1

我使用的是带有swift的Xcode 6.3(我认为是1.2版本)。我的应用程序从网上的自定义服务器下载照片。然后,它需要将具有给定文件名的照片保存到通过照片框架创建的自定义相册中。我需要能够控制照片/文件名,因为我跟踪了我在数据库中下载的哪些照片,并且以后需要按照名称查看它们。 我创建了一个自定义的PhotoAlbum类,我试图包装与相册交互的所有逻辑。一旦我下载了一张照片,我可以调用以下代码,并且它的工作原理与创建相册和保存照片一样远,但正如您在savePhoto()方法中注意到的那样,我不知道在保存时如何使用photoName变量命名照片。最后,我还需要知道如何通过名称以及loadPhoto()方法来检索照片。感谢您提供任何帮助/建议。如何在通过iOS Swift照片框架保存照片时命名照片

通过MyAlbum让=天地我的相簿( “通过MyAlbum”)

myAlbum.savePhoto(downloadedPhoto,12)

class PhotoAlbum { 

var albumName: String = "" 
var albumExists: Bool = false 
var assetCollection: PHAssetCollection! 
var photosAsset: PHFetchResult! 

init(albumName: String) { 
    self.albumName = albumName 
    self.initializeAlbum() 
} 

private func initializeAlbum() { 

    let fetchOptions = PHFetchOptions() 
    fetchOptions.predicate = NSPredicate(format: "title = %@", self.albumName) 
    let collection: PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: fetchOptions) 

    if let firstObject: AnyObject = collection.firstObject { 
     self.albumExists = true 
     self.assetCollection = collection.firstObject as! PHAssetCollection 
     if let ac = self.assetCollection { 
      self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil) 
     } 
     println("\(self.albumName) album exists") 
    } 
    else { 
     var albumPlaceHolder: PHObjectPlaceholder! 

     PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 

      let request = PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(self.albumName) 
      albumPlaceHolder = request.placeholderForCreatedAssetCollection 

     }, completionHandler: { (success: Bool, error: NSError!) in 

      self.albumExists = success 
      if success { 
       let collection = PHAssetCollection.fetchAssetCollectionsWithLocalIdentifiers([albumPlaceHolder.localIdentifier], options: nil) 
       self.assetCollection = collection.firstObject as! PHAssetCollection 
       if let ac = self.assetCollection { 
        self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil) 
       } 
       println("\(self.albumName) album made") 
      } 
      else { 
       println("Failed to create \(self.albumName) Album!!!!!!") 
      } 

     }) 
    } 

} 


func savePhoto(image: UIImage, photoID: Int) { 
    let photoName = String(photoID)+".jpg" 

    PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 
     let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
     let assetPlaceholder = assetRequest.placeholderForCreatedAsset 
     let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection, assets: self.photosAsset) 
     albumChangeRequest.addAssets([assetPlaceholder]) 
     }, completionHandler: { (success: Bool, error: NSError!) in 

      print(success ? "image added" : "failed to add image") 

    }) 
} 

func loadPhoto(photoID: Int64) -> UIImage { 
    let photoName = String(photoID)+".jpg" 

    return UIImage(named: "no_photo")! 
} 

func renameAlbum(newAlbumName: String) { 
    // need to create the new album and move all photos to that album then remove the old album 

} 

func reloadPhotos() { 
    if let ac = self.assetCollection { 
     self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil) 
    } 
} 
+0

此外,如果我没有办法“命名”照片,那么是否有任何类型的标识符与我可以保存的照片/资产绑定,以便稍后可以通过该标识符请求该照片? –

回答

8

而不是 '命名' 的文件时,你需要服用一记localIdentifier的您正在创建的资产的属性。 localIdentifier是一个持久标识符(即它将在​​重新启动/重新加载时是资产的一致ID)。

我拼凑了一些基本代码,您可以使用它们在保存图像时获取localIdentifier,并通过localIdentifier检索图像。希望这会让你走。

import UIKit 
import Photos 

class MRPhotosHelper { 

    var manager = PHImageManager.defaultManager() 

    func saveImageAsAsset(image: UIImage, completion: (localIdentifier:String?) -> Void) { 

     var imageIdentifier: String? 

     PHPhotoLibrary.sharedPhotoLibrary().performChanges({() -> Void in 
      let changeRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
      let placeHolder = changeRequest.placeholderForCreatedAsset 
      imageIdentifier = placeHolder.localIdentifier 
     }, completionHandler: { (success, error) -> Void in 
      if success { 
       completion(localIdentifier: imageIdentifier) 
      } else { 
       completion(localIdentifier: nil) 
      } 
     }) 
    } 

    func retrieveImageWithIdentifer(localIdentifier:String, completion: (image:UIImage?) -> Void) { 
     let fetchOptions = PHFetchOptions() 
     fetchOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.Image.rawValue) 
     let fetchResults = PHAsset.fetchAssetsWithLocalIdentifiers([localIdentifier], options: fetchOptions) 

     if fetchResults.count > 0 { 
      if let imageAsset = fetchResults.objectAtIndex(0) as? PHAsset { 
       let requestOptions = PHImageRequestOptions() 
       requestOptions.deliveryMode = .HighQualityFormat 
       manager.requestImageForAsset(imageAsset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFill, options: requestOptions, resultHandler: { (image, info) -> Void in 
        completion(image: image) 
       }) 
      } else { 
       completion(image: nil) 
      } 
     } else { 
      completion(image: nil) 
     } 
    } 
} 

然后,您可以做这样的事情:

// get a reference to our helper 
    let helper = MRPhotosHelper() 

    // a var to store the localIdentifier for the image we save 
    var identifier:String? 

    // save the image to library 
    if let imageToSave = UIImage(named: "SomeImageName"){ 
     helper.saveImageAsAsset(imageToSave, completion: { (localIdentifier) -> Void in 
      identifier = localIdentifier 
     }) 
    } 

    // other stuff 

    // retrieve image from library at later date 
    if let identifier = identifier { 
     helper.retrieveImageWithIdentifer(identifier, completion: { (image) -> Void in 
      let retrievedImage = image 
     }) 
    } 

你可能要检查你回来在完成关闭主线程使用更新UI之前。

+0

这应该是被接受的答案 –