我正在尝试获取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;
}
任何人都可以帮助我获取要显示的正确图片网址吗?
答案 0 :(得分:15)
解决方案是始终使用相同的库来访问所有类中的资产。您在上面显示的单例解决方案很好 - 只要您的所有类都调用defaultAssetsLibrary
,并且它们都没有分配/初始化它们自己的ALAssetsLibrary
。
答案 1 :(得分:1)
我有同样的问题。我终于解决了它。
这是我的条件:我有两个控制器,第一个推到第二个。在第一篇文章中,我使用以下代码初始化了库:
let library = ALAssetsLibrary()
我将所有组信息放入一个数组中,以便我可以在第二个视图控制器中使用它们。但这可能导致团体中没有照片。
,错误信息与您的相同。
这是因为库是由系统发布的。并且所有照片信息仅在其拥有的ALAssetsLibrary的生命周期内有效。所以group.numberOfAssets()将为0。
解决方案是避免在第一个控制器发布之前发布库。 所以我使用以下代码:
static let library = ALAssetsLibrary()
firstViewController.library.enmurate.....balabala
希望这可以帮助某人。