Skip to content

Instantly share code, notes, and snippets.

@w-i-n-s
Forked from khorbushko/PHPhotoLibrary+SaveImage
Created December 12, 2018 16:20
Show Gist options
  • Select an option

  • Save w-i-n-s/9d15ec7beff3fead6b041c687ef00c90 to your computer and use it in GitHub Desktop.

Select an option

Save w-i-n-s/9d15ec7beff3fead6b041c687ef00c90 to your computer and use it in GitHub Desktop.

Revisions

  1. gbk revised this gist Dec 29, 2016. No changes.
  2. gbk created this gist Dec 29, 2016.
    93 changes: 93 additions & 0 deletions PHPhotoLibrary+SaveImage
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,93 @@
    import UIKit
    import Photos

    extension PHPhotoLibrary {
    // MARK: - PHPhotoLibrary+SaveImage

    // MARK: - Public

    func savePhoto(image:UIImage, albumName:String, completion:((PHAsset?)->())? = nil) {
    func save() {
    if let album = PHPhotoLibrary.shared().findAlbum(albumName: albumName) {
    PHPhotoLibrary.shared().saveImage(image: image, album: album, completion: completion)
    } else {
    PHPhotoLibrary.shared().createAlbum(albumName: albumName, completion: { (collection) in
    if let collection = collection {
    PHPhotoLibrary.shared().saveImage(image: image, album: collection, completion: completion)
    } else {
    completion?(nil)
    }
    })
    }
    }

    if PHPhotoLibrary.authorizationStatus() == .authorized {
    save()
    } else {
    PHPhotoLibrary.requestAuthorization({ (status) in
    if status == .authorized {
    save()
    }
    })
    }
    }

    // MARK: - Private

    fileprivate func findAlbum(albumName: String) -> PHAssetCollection? {
    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
    let fetchResult : PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)
    guard let photoAlbum = fetchResult.firstObject else {
    return nil
    }
    return photoAlbum
    }

    fileprivate func createAlbum(albumName: String, completion: @escaping (PHAssetCollection?)->()) {
    var albumPlaceholder: PHObjectPlaceholder?
    PHPhotoLibrary.shared().performChanges({
    let createAlbumRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: albumName)
    albumPlaceholder = createAlbumRequest.placeholderForCreatedAssetCollection
    }, completionHandler: { success, error in
    if success {
    guard let placeholder = albumPlaceholder else {
    completion(nil)
    return
    }
    let fetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [placeholder.localIdentifier], options: nil)
    guard let album = fetchResult.firstObject else {
    completion(nil)
    return
    }
    completion(album)
    } else {
    completion(nil)
    }
    })
    }

    fileprivate func saveImage(image: UIImage, album: PHAssetCollection, completion:((PHAsset?)->())? = nil) {
    var placeholder: PHObjectPlaceholder?
    PHPhotoLibrary.shared().performChanges({
    let createAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
    guard let albumChangeRequest = PHAssetCollectionChangeRequest(for: album),
    let photoPlaceholder = createAssetRequest.placeholderForCreatedAsset else { return }
    placeholder = photoPlaceholder
    let fastEnumeration = NSArray(array: [photoPlaceholder] as [PHObjectPlaceholder])
    albumChangeRequest.addAssets(fastEnumeration)
    }, completionHandler: { success, error in
    guard let placeholder = placeholder else {
    completion?(nil)
    return
    }
    if success {
    let assets:PHFetchResult<PHAsset> = PHAsset.fetchAssets(withLocalIdentifiers: [placeholder.localIdentifier], options: nil)
    let asset:PHAsset? = assets.firstObject
    completion?(asset)
    } else {
    completion?(nil)
    }
    })
    }
    }