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

时间:2013-06-08 19:50:12

标签: 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);
                     }];

这是在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我的数组结果类似于" ALAsset - 类型:未知,URL:(null)"。

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

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

任何人都可以帮助我获取要显示的正确图片网址吗?

2 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:1)

我有同样的问题。我终于解决了它。

这是我的条件:我有两个控制器,第一个推到第二个。在第一篇文章中,我使用以下代码初始化了库:

let library = ALAssetsLibrary()

我将所有组信息放入一个数组中,以便我可以在第二个视图控制器中使用它们。但这可能导致团体中没有照片。

,错误信息与您的相同。

这是因为库是由系统发布的。并且所有照片信息仅在其拥有的ALAssetsLibrary的生命周期内有效。所以group.numberOfAssets()将为0。

解决方案是避免在第一个控制器发布之前发布库。 所以我使用以下代码:

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

希望这可以帮助某人。