UGCKitAssetLoader.m 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright (c) 2019 Tencent. All rights reserved.
  2. #import "UGCKitAssetLoader.h"
  3. #import <Photos/Photos.h>
  4. @interface UGCKitAssetLoader ()
  5. @end
  6. @implementation UGCKitAssetLoader
  7. - (void)load:(void (^)(void))completion {
  8. // Fetch user albums and smart albums
  9. __weak __typeof(self) weakSelf = self;
  10. void (^doFetch)(void) = ^{
  11. __strong __typeof(weakSelf) self = weakSelf;
  12. PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
  13. PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
  14. self.fetchResults = @[smartAlbums, userAlbums];
  15. [self updateAssetCollections];
  16. if (completion) {
  17. completion();
  18. }
  19. };
  20. // Register observer
  21. // [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
  22. if (PHAuthorizationStatusAuthorized != [PHPhotoLibrary authorizationStatus]) {
  23. [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
  24. if (PHAuthorizationStatusAuthorized == status) {
  25. dispatch_async(dispatch_get_main_queue(), doFetch);
  26. }
  27. }];
  28. } else {
  29. doFetch();
  30. }
  31. }
  32. - (void)updateAssetCollections
  33. {
  34. NSArray<NSNumber *> * assetCollectionSubtypes = @[
  35. @(PHAssetCollectionSubtypeSmartAlbumUserLibrary),
  36. @(PHAssetCollectionSubtypeAlbumMyPhotoStream),
  37. @(PHAssetCollectionSubtypeSmartAlbumPanoramas),
  38. @(PHAssetCollectionSubtypeSmartAlbumVideos),
  39. @(PHAssetCollectionSubtypeSmartAlbumBursts)
  40. ];
  41. // Filter albums
  42. NSMutableDictionary *smartAlbums = [NSMutableDictionary dictionaryWithCapacity:assetCollectionSubtypes.count];
  43. NSMutableArray *userAlbums = [NSMutableArray array];
  44. for (PHFetchResult *fetchResult in self.fetchResults) {
  45. [fetchResult enumerateObjectsUsingBlock:^(PHAssetCollection *assetCollection, NSUInteger index, BOOL *stop) {
  46. PHAssetCollectionSubtype subtype = assetCollection.assetCollectionSubtype;
  47. if (subtype == PHAssetCollectionSubtypeAlbumRegular) {
  48. [userAlbums addObject:assetCollection];
  49. } else if ([assetCollectionSubtypes containsObject:@(subtype)]) {
  50. if (!smartAlbums[@(subtype)]) {
  51. smartAlbums[@(subtype)] = [NSMutableArray array];
  52. }
  53. [smartAlbums[@(subtype)] addObject:assetCollection];
  54. }
  55. }];
  56. }
  57. NSMutableArray *assetCollections = [NSMutableArray array];
  58. // Fetch smart albums
  59. for (NSNumber *assetCollectionSubtype in assetCollectionSubtypes) {
  60. NSArray *collections = smartAlbums[assetCollectionSubtype];
  61. if (collections) {
  62. [assetCollections addObjectsFromArray:collections];
  63. }
  64. }
  65. // Fetch user albums
  66. [userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *assetCollection, NSUInteger index, BOOL *stop) {
  67. [assetCollections addObject:assetCollection];
  68. }];
  69. self.assetCollections = assetCollections;
  70. }
  71. @end