MTImagePickerPhotosModel.swift 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. //
  2. // MTImagePickerPhotosModel.swift
  3. // MTImagePicker
  4. //
  5. // Created by Luo on 6/27/16.
  6. // Copyright © 2016 Luo. All rights reserved.
  7. //
  8. import UIKit
  9. import Photos
  10. @available(iOS 8.0, *)
  11. public class MTImagePickerPhotosModel: MTImagePickerModel {
  12. public var phasset: PHAsset!
  13. init(mediaType: MTImagePickerMediaType, sortNumber: Int, phasset: PHAsset) {
  14. super.init(mediaType: mediaType, sortNumber: sortNumber)
  15. self.phasset = phasset
  16. }
  17. override func getFileName() -> String? {
  18. var fileName: String?
  19. self.fetchDataSync {
  20. (_, _, _, infoDict) in
  21. if let name = (infoDict?["PHImageFileURLKey"] as? NSURL)?.lastPathComponent {
  22. fileName = name
  23. }
  24. }
  25. return fileName
  26. }
  27. override func getThumbImage(size: CGSize) -> UIImage? {
  28. var img: UIImage?
  29. let options = PHImageRequestOptions()
  30. options.deliveryMode = .fastFormat
  31. options.isSynchronous = true
  32. PHImageManager.default().requestImage(for: self.phasset, targetSize: size, contentMode: .aspectFill, options: options) {
  33. image, _ in
  34. img = image
  35. }
  36. return img
  37. }
  38. override func getPreviewImage() -> UIImage? {
  39. var img: UIImage?
  40. let options = PHImageRequestOptions()
  41. options.deliveryMode = .fastFormat
  42. options.isSynchronous = true
  43. var size = UIScreen.main.compatibleBounds.size
  44. size = CGSize(width: size.width / 3.0, height: size.height / 3.0)
  45. PHImageManager.default().requestImage(for: self.phasset, targetSize: size, contentMode: .aspectFit, options: options) {
  46. image, _ in
  47. img = image
  48. }
  49. return img
  50. }
  51. override func getImageAsync(complete:@escaping (UIImage?) -> Void) {
  52. let options = PHImageRequestOptions()
  53. options.deliveryMode = .highQualityFormat
  54. let size = UIScreen.main.compatibleBounds.size
  55. PHImageManager.default().requestImage(for: self.phasset, targetSize: size, contentMode: .aspectFit, options: options) {
  56. image, _ in
  57. complete(image)
  58. }
  59. }
  60. override func getVideoDurationAsync(complete:@escaping (Double) -> Void) {
  61. PHImageManager.default().requestAVAsset(forVideo: self.phasset, options: nil) {
  62. avasset, _, _ in
  63. if let asset = avasset {
  64. let duration = Double(asset.duration.value) / Double(asset.duration.timescale)
  65. complete(duration)
  66. }
  67. }
  68. }
  69. override func getAVPlayerItem() -> AVPlayerItem? {
  70. return self.fetchAVPlayerItemSync()
  71. }
  72. override func getFileSize() -> Int {
  73. var fileSize = 0
  74. self.fetchDataSync {
  75. (data, _, _, _) in
  76. if let d = data {
  77. fileSize = d.length
  78. }
  79. }
  80. return fileSize
  81. }
  82. private func fetchAVPlayerItemSync() -> AVPlayerItem? {
  83. var playerItem: AVPlayerItem?
  84. let sem = DispatchSemaphore(value: 0)
  85. PHImageManager.default().requestPlayerItem(forVideo: self.phasset, options: nil) {
  86. item, _ in
  87. playerItem = item
  88. sem.signal()
  89. }
  90. sem.wait()
  91. return playerItem
  92. }
  93. private func fetchDataSync(complete:@escaping (NSData?, String?, UIImage.Orientation, [AnyHashable: Any]?) -> Void) {
  94. let requestOptions = PHImageRequestOptions()
  95. requestOptions.isSynchronous = true
  96. PHImageManager.default().requestImageData(for: self.phasset, options: requestOptions) {
  97. (data, dataUTI, orientation, infoDict) in
  98. complete(data as NSData?, dataUTI, orientation, infoDict)
  99. }
  100. }
  101. }
  102. @available(iOS 8.0, *)
  103. class MTImagePickerPhotosAlbumModel: MTImagePickerAlbumModel {
  104. private var result: PHFetchResult<AnyObject>
  105. private var _albumCount: Int
  106. private var _albumName: String?
  107. init(result: PHFetchResult<AnyObject>, albumCount: Int, albumName: String?) {
  108. self.result = result
  109. self._albumName = albumName
  110. self._albumCount = albumCount
  111. }
  112. override func getAlbumCount() -> Int {
  113. return self._albumCount
  114. }
  115. override func getAlbumName() -> String? {
  116. return self._albumName
  117. }
  118. override func getAlbumImage(size: CGSize) -> UIImage? {
  119. if let asset = self.result.object(at: 0) as? PHAsset {
  120. let model = MTImagePickerPhotosModel(mediaType: .Photo, sortNumber: 0, phasset: asset)
  121. return model.getThumbImage(size: size)
  122. }
  123. return nil
  124. }
  125. override func getMTImagePickerModelsListAsync(complete: @escaping ([MTImagePickerModel]) -> Void) {
  126. var models = [MTImagePickerModel]()
  127. DispatchQueue.global(qos: .default).async {
  128. self.result.enumerateObjects({ (asset, index, _) -> Void in
  129. if let phasset = asset as? PHAsset {
  130. let mediaType: MTImagePickerMediaType = phasset.mediaType == .image ? .Photo : .Video
  131. let model = MTImagePickerPhotosModel(mediaType: mediaType, sortNumber: index, phasset: phasset)
  132. models.append(model)
  133. }
  134. })
  135. DispatchQueue.main.async {
  136. complete(models)
  137. }
  138. }
  139. }
  140. }