ALAssetPrivate за время жизни своей библиотеки ALAssetsLibrary

Я пытаюсь получить все изображения, которые находятся на photos.app, и отобразить их в UICollectionView. У меня есть этот код для извлечения изображений:

ALAssetsLibrary *al = [ViewController defaultAssetsLibrary];

ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result, NSUInteger index, BOOL *stop){

    if (result!=NULL) {

        if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {

            [imagesGotFromUserLibrary addObject:result];
        }

    }
};

ALAssetsLibraryGroupsEnumerationResultsBlock
libraryGroupsEnumeration = ^(ALAssetsGroup* group, BOOL* stop){
    [group setAssetsFilter:[ALAssetsFilter allPhotos]];

    if (group!=nil)
    {

        [group enumerateAssetsUsingBlock:groupEnumerAtion];
    }
    else
    {

        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            GalleryCollectionViewController *otherController = [[GalleryCollectionViewController alloc] init];
            [otherController receiveImagesWithMutableArray:imagesGotFromUserLibrary];

        });
    }

};



al = [[ALAssetsLibrary alloc] init];
[al enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                       usingBlock:libraryGroupsEnumeration
                     failureBlock:^(NSError *error){
                         NSLog(@"ERROR: %@", error);
                     }];

Это в viewDidLoad, а затем:

+ (ALAssetsLibrary *)defaultAssetsLibrary {
static dispatch_once_t pred = 0;
static ALAssetsLibrary *library = nil;
dispatch_once(&pred, ^{
    library = [[ALAssetsLibrary alloc] init];
});
return library;
}

Эта часть кода отправляет массив другому контроллеру, который будет устанавливать изображения в мой UICollectionView. Проблема в том, что я получаю сообщение об ошибке "неверная попытка получить доступ к прошлому времени своей собственной ALAssetsLibrary", и если я попытаюсь NSLog my array, результат будет похож на "ALAsset - Type: Unknown, URLs: (null)".

Я посмотрел в Интернете, и я нашел решение. Я должен добавить эту строку кода, но она не работает. Код:

+ (ALAssetsLibrary *)defaultAssetsLibrary {
static dispatch_once_t pred = 0;
static ALAssetsLibrary *library = nil;
dispatch_once(&pred, ^{
    library = [[ALAssetsLibrary alloc] init];
});
return library;
}

Кто-нибудь может помочь мне получить правильные URL-адреса изображений?

Ответ 1

Решение состоит в том, чтобы всегда использовать одну и ту же библиотеку для всех доступов к активам во всех ваших классах. Выбранное выше одноэлементное решение является хорошим - пока все ваши классы вызывают defaultAssetsLibrary, и ни один из них не выделяет/не запускает свои собственные ALAssetsLibrary.

Ответ 2

У меня та же проблема. И я, наконец, решил это.

Это мое условие: у меня два контроллера, первый - на второй. В первом я инициализировал библиотеку, используя следующий код:

let library = ALAssetsLibrary()

и я помещаю всю информацию о группе в массив, чтобы я мог использовать их во втором контроллере представления. Но это может привести к отсутствию фото в группе.

и сообщение об ошибке совпадает с вашим.

Это потому, что библиотека выпущена системой. И вся информация о фотографии действительна только в течение жизни своей библиотеки ALAssetsLibrary. Таким образом, group.numberOfAssets() будет 0.

Решение не позволяет освободить библиотеку до выхода первого контроллера. Поэтому я использую следующий код:

static let library = ALAssetsLibrary()
firstViewController.library.enmurate.....balabala

Надеюсь, это может помочь кому-то.