HXPickerResult.m 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //
  2. // HXPickerResult.m
  3. // HXPhotoPickerExample
  4. //
  5. // Created by Slience on 2021/12/6.
  6. // Copyright © 2021 洪欣. All rights reserved.
  7. //
  8. #import "HXPickerResult.h"
  9. @interface HXPickerResult()
  10. @property (copy, nonatomic) NSArray<HXPhotoModel *> *models;
  11. @property (assign, nonatomic) BOOL isOriginal;
  12. @end
  13. @implementation HXPickerResult
  14. - (instancetype)initWithModels:(NSArray<HXPhotoModel *> *)models
  15. isOriginal:(BOOL)isOriginal {
  16. self = [super init];
  17. if (self) {
  18. self.models = models;
  19. self.isOriginal = isOriginal;
  20. }
  21. return self;
  22. }
  23. - (void)getURLsWithVideoExportPreset:(HXVideoExportPreset)videoExportPreset
  24. videoQuality:(NSInteger)videoQuality
  25. UrlHandler:(void (^ _Nullable)(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel, NSInteger index))urlHandler
  26. completionHandler:(void (^ _Nullable)(void))completionHandler {
  27. dispatch_group_t group = dispatch_group_create();
  28. dispatch_queue_t queue = dispatch_queue_create("hxphpicker.get.urls", NULL);
  29. NSInteger index = 0;
  30. for (HXPhotoModel *model in self.models) {
  31. dispatch_group_async(group, queue, ^{
  32. dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  33. if (model.subType == HXPhotoModelMediaSubTypePhoto) {
  34. [model getImageURLWithResultHandler:^(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel) {
  35. if (urlHandler) {
  36. urlHandler(result, photoModel, index);
  37. }
  38. dispatch_semaphore_signal(semaphore);
  39. }];
  40. }else {
  41. [model getVideoURLWithExportPreset:videoExportPreset videoQuality:videoQuality resultHandler:^(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel) {
  42. if (urlHandler) {
  43. urlHandler(result, photoModel, index);
  44. }
  45. dispatch_semaphore_signal(semaphore);
  46. }];
  47. }
  48. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  49. });
  50. index++;
  51. }
  52. dispatch_group_notify(group, queue, ^{
  53. if (completionHandler) {
  54. completionHandler();
  55. }
  56. });
  57. }
  58. - (void)getImageURLsWithUrlHandler:(void (^ _Nullable)(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel, NSInteger index))urlHandler
  59. completionHandler:(void (^ _Nullable)(void))completionHandler {
  60. dispatch_group_t group = dispatch_group_create();
  61. dispatch_queue_t queue = dispatch_queue_create("hxphpicker.get.imageURL", NULL);
  62. NSInteger index = 0;
  63. for (HXPhotoModel *model in self.models) {
  64. if (model.subType != HXPhotoModelMediaSubTypePhoto) {
  65. continue;
  66. }
  67. dispatch_group_async(group, queue, ^{
  68. dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  69. [model getImageURLWithResultHandler:^(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel) {
  70. if (urlHandler) {
  71. urlHandler(result, photoModel, index);
  72. }
  73. dispatch_semaphore_signal(semaphore);
  74. }];
  75. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  76. });
  77. index++;
  78. }
  79. dispatch_group_notify(group, queue, ^{
  80. if (completionHandler) {
  81. completionHandler();
  82. }
  83. });
  84. }
  85. - (void)getVideoURlsWithExportPreset:(HXVideoExportPreset)exportPreset
  86. videoQuality:(NSInteger)videoQuality
  87. urlHandler:(void (^ _Nullable)(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel, NSInteger index))urlHandler
  88. completionHandler:(void (^ _Nullable)(void))completionHandler {
  89. dispatch_group_t group = dispatch_group_create();
  90. dispatch_queue_t queue = dispatch_queue_create("hxphpicker.get.videoURL", NULL);
  91. NSInteger index = 0;
  92. for (HXPhotoModel *model in self.models) {
  93. if (model.subType != HXPhotoModelMediaSubTypeVideo) {
  94. continue;
  95. }
  96. dispatch_group_async(group, queue, ^{
  97. dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  98. [model getVideoURLWithExportPreset:exportPreset videoQuality:videoQuality resultHandler:^(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel) {
  99. if (urlHandler) {
  100. urlHandler(result, photoModel, index);
  101. }
  102. dispatch_semaphore_signal(semaphore);
  103. }];
  104. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  105. });
  106. index++;
  107. }
  108. dispatch_group_notify(group, queue, ^{
  109. if (completionHandler) {
  110. completionHandler();
  111. }
  112. });
  113. }
  114. @end
  115. @interface HXAssetURLResult()
  116. @property (strong, nonatomic) NSURL *url;
  117. @property (assign, nonatomic) HXAssetURLType urlType;
  118. @property (assign, nonatomic) HXPhotoModelMediaSubType mediaType;
  119. @end
  120. @implementation HXAssetURLResult
  121. - (instancetype)initWithUrl:(NSURL *)url
  122. urlType:(HXAssetURLType)urlType
  123. mediaType:(HXPhotoModelMediaSubType)mediaType {
  124. self = [super init];
  125. if (self) {
  126. self.url = url;
  127. self.urlType = urlType;
  128. self.mediaType = mediaType;
  129. }
  130. return self;
  131. }
  132. @end