- 
      
 - 
        
Save khorbushko/f090595f6207f6c93c24f30a30194aac to your computer and use it in GitHub Desktop.  
| 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) | |
| } | |
| }) | |
| } | |
| } | 
Fun iOS 13 bug, smaller png images with transparency (maybe around under 1024x1024) save as jpegs instead.
can't call this extension inside of a viewController. I'm getting this error 'NSInternalInconsistencyException', reason: '-[PHPhotoLibrary init] unsupported'. any suggestion?
can't call this extension inside of a viewController. I'm getting this error 'NSInternalInconsistencyException', reason: '-[PHPhotoLibrary init] unsupported'. any suggestion?
Getting the same issue here
i have not tried this actual extension code, but i was getting the error 'NSInternalInconsistencyException', reason: '-[PHPhotoLibrary init] unsupported'. and the reason was that i was trying to do "var library: PHPhotoLibrary = PHPhotoLibrary()" instead of using the PHPhotoLibrary.shared(). Maybe not the reason y'all are having the issue, but i'm posting this here because i was getting that same error and resolved it by not doing that.
Really helpful, thanks a lot for shearing
how to same image to defult camera roll . when gave title it creating new album with camera roll