ALAssetPrivate超过其拥有的ALAssetsLibrary的生命周期

Bal*_*ick 10 ios 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);
                     }];
Run Code Online (Sandbox Code Playgroud)

这是在viewDidLoad然后:

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

这段代码将一个数组发送到另一个控制器,该控制器将图像设置为我的UICollectionView.问题是我收到错误"无法尝试访问其拥有的ALAssetsLibrary的生命周期",如果我尝试NSLog我的数组,结果类似于"ALAsset - Type:Unknown,URL:(null)".

我抬头看了互联网,找到了解决方案.我应该添加这行代码,但它不起作用.代码是:

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

任何人都能帮助我获取正确的图像URL显示?

Wai*_*ain 15

解决方案是始终使用相同的库来访问所有类中的资产.您在上面显示的单例解决方案很好 - 只要您的所有类都调用defaultAssetsLibrary它们,并且它们都不会分配/初始化它们自己的类ALAssetsLibrary.

  • 您需要将defaultAssetsLibrary方法移动到常见的位置,以便不会销毁库.应用程序委托或第一个视图控制器(如果它推送选择资产并将它们发送回第一个视图的第二个视图控制器). (2认同)