SingleImageSaver.swift 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //
  2. // SingleImageSavingInteractor.swift
  3. // ALCameraViewController
  4. //
  5. // Created by Alex Littlejohn on 2016/02/16.
  6. // Copyright © 2016 zero. All rights reserved.
  7. //
  8. import UIKit
  9. import Photos
  10. public typealias SingleImageSaverSuccess = (PHAsset) -> Void
  11. public typealias SingleImageSaverFailure = (NSError) -> Void
  12. public class SingleImageSaver {
  13. private let errorDomain = "com.zero.singleImageSaver"
  14. private var success: SingleImageSaverSuccess?
  15. private var failure: SingleImageSaverFailure?
  16. private var image: UIImage?
  17. public init() { }
  18. public func onSuccess(_ success: @escaping SingleImageSaverSuccess) -> Self {
  19. self.success = success
  20. return self
  21. }
  22. public func onFailure(_ failure: @escaping SingleImageSaverFailure) -> Self {
  23. self.failure = failure
  24. return self
  25. }
  26. public func setImage(_ image: UIImage) -> Self {
  27. self.image = image
  28. return self
  29. }
  30. public func save() -> Self {
  31. _ = PhotoLibraryAuthorizer { error in
  32. if error == nil {
  33. self._save()
  34. } else {
  35. self.failure?(error!)
  36. }
  37. }
  38. return self
  39. }
  40. private func _save() {
  41. guard let image = image else {
  42. self.invokeFailure()
  43. return
  44. }
  45. var assetIdentifier: PHObjectPlaceholder?
  46. PHPhotoLibrary.shared()
  47. .performChanges({
  48. let request = PHAssetChangeRequest.creationRequestForAsset(from: image)
  49. assetIdentifier = request.placeholderForCreatedAsset
  50. }) { finished, error in
  51. guard let assetIdentifier = assetIdentifier, finished else {
  52. self.invokeFailure()
  53. return
  54. }
  55. self.fetch(assetIdentifier)
  56. }
  57. }
  58. private func fetch(_ assetIdentifier: PHObjectPlaceholder) {
  59. let assets = PHAsset.fetchAssets(withLocalIdentifiers: [assetIdentifier.localIdentifier], options: nil)
  60. DispatchQueue.main.async {
  61. guard let asset = assets.firstObject else {
  62. self.invokeFailure()
  63. return
  64. }
  65. self.success?(asset)
  66. }
  67. }
  68. private func invokeFailure() {
  69. let error = errorWithKey("error.cant-fetch-photo", domain: errorDomain)
  70. failure?(error)
  71. }
  72. }