10

我正在尝试获取 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 - 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 以显示?

4

2 回答 2

15

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

于 2013-06-08T20:47:47.017 回答
1

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

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

let library = ALAssetsLibrary()

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

并且错误消息与您的相同。

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

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

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

希望这可以帮助某人。

于 2015-05-14T10:08:24.533 回答