SingleImageFetcher.swift 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //
  2. // SingleImageFetcher.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 SingleImageFetcherSuccess = (UIImage) -> Void
  11. public typealias SingleImageFetcherFailure = (NSError) -> Void
  12. public class SingleImageFetcher {
  13. private let errorDomain = "com.zero.singleImageSaver"
  14. private var success: SingleImageFetcherSuccess?
  15. private var failure: SingleImageFetcherFailure?
  16. private var asset: PHAsset?
  17. private var targetSize = PHImageManagerMaximumSize
  18. private var cropRect: CGRect?
  19. public init() { }
  20. public func onSuccess(_ success: @escaping SingleImageFetcherSuccess) -> Self {
  21. self.success = success
  22. return self
  23. }
  24. public func onFailure(_ failure: @escaping SingleImageFetcherFailure) -> Self {
  25. self.failure = failure
  26. return self
  27. }
  28. public func setAsset(_ asset: PHAsset) -> Self {
  29. self.asset = asset
  30. return self
  31. }
  32. public func setTargetSize(_ targetSize: CGSize) -> Self {
  33. self.targetSize = targetSize
  34. return self
  35. }
  36. public func setCropRect(_ cropRect: CGRect) -> Self {
  37. self.cropRect = cropRect
  38. return self
  39. }
  40. public func fetch() -> Self {
  41. _ = PhotoLibraryAuthorizer { error in
  42. if error == nil {
  43. self._fetch()
  44. } else {
  45. self.failure?(error!)
  46. }
  47. }
  48. return self
  49. }
  50. private func _fetch() {
  51. guard let asset = asset else {
  52. let error = errorWithKey("error.cant-fetch-photo", domain: errorDomain)
  53. failure?(error)
  54. return
  55. }
  56. let options = PHImageRequestOptions()
  57. options.deliveryMode = .highQualityFormat
  58. options.isNetworkAccessAllowed = true
  59. if let cropRect = cropRect {
  60. options.normalizedCropRect = cropRect
  61. options.resizeMode = .exact
  62. let targetWidth = floor(CGFloat(asset.pixelWidth) * cropRect.width)
  63. let targetHeight = floor(CGFloat(asset.pixelHeight) * cropRect.height)
  64. targetSize = CGSize(width: targetWidth, height: targetHeight)
  65. }
  66. PHImageManager.default().requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: options) { image, _ in
  67. if let image = image {
  68. self.success?(image)
  69. } else {
  70. let error = errorWithKey("error.cant-fetch-photo", domain: self.errorDomain)
  71. self.failure?(error)
  72. }
  73. }
  74. }
  75. }