2016-04-07 23 views
6

Tôi có một album hình ảnh được quản lý bởi máy chủ từ xa hay không. Tôi muốn cung cấp cho người dùng tùy chọn tải xuống album và lưu trữ album đó vào album tùy chỉnh trong Ảnh. Nhưng kể từ khi album là năng động (hình ảnh được thêm vào nó) người dùng có thể tải nó nhiều lần. Tôi không muốn tải xuống cùng một hình ảnh nhiều lần, chỉ những hình ảnh mới.Kiểm tra xem hình ảnh có tồn tại trong Ảnh

Có thể liên kết một số siêu dữ liệu (id duy nhất) khi tôi lưu trữ hình ảnh trong ứng dụng Ảnh không? Và sau đó kiểm tra xem hình ảnh đó đã tồn tại chưa?

Tôi đang sử dụng Khung ảnh để tạo album tùy chỉnh và lưu ảnh.

Edit: Đây là mã của tôi để tạo album tùy chỉnh và lưu các ảnh

/** 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

có thể hữu ích khi chỉnh sửa câu hỏi của bạn để hiển thị mã về cách bạn tải xuống và lưu ảnh vào album tùy chỉnh này –

Trả lời

1

Tất cả bạn cần làm là đọc "localIdentifier" từ placeholder tài sản. Tôi đã tăng cường mã của bạn để trả về mã định danh trong trình xử lý hoàn thành. Bạn có thể muốn đối phó với các tùy chọn đó.

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) 

    } 
} 

Khi bạn muốn đọc lại nội dung đó, phương pháp tải hình ảnh của bạn có thể trông giống như thế này (Tôi chưa sử dụng quy ước hoặc tên biến). Thao tác này sẽ đọc nội dung một cách đồng bộ nhưng tôi chắc chắn bạn có thể phát hiện tùy chọn async.

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 
} 
Các vấn đề liên quan