Ios ALAssetPrivate在其拥有的AlassetLibrary的生命周期内

Ios ALAssetPrivate在其拥有的AlassetLibrary的生命周期内,ios,alassetslibrary,Ios,Alassetslibrary,我正在尝试获取photos.app中的所有图像,并将其显示在UICollectionView中。我有以下代码来检索图像: ALAssetsLibrary *al = [ViewController defaultAssetsLibrary]; ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result, NSUInteger index, BOOL *stop){ if (result!=NULL

我正在尝试获取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;
}
这段代码将向另一个控制器发送一个数组,该控制器将图像设置为my UICollectionView。问题是,我收到了一个错误“在其所属AlassetLibrary的生存期内访问无效”,如果我尝试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;
}

任何人都可以帮助我获得正确的图像URL来显示吗?

解决方案是始终使用相同的库来访问所有类中的资产。上面显示的单例解决方案很好-只要所有类都调用
DefaultAssetLibrary
,并且没有一个类将自己的
AlasSetLibrary
,我就有同样的问题。我终于解决了

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

let library = ALAssetsLibrary()
static let library = ALAssetsLibrary()
firstViewController.library.enmurate.....balabala
我将所有组信息放入一个数组中,以便在第二个视图控制器中使用它们。但这可能会导致没有合影

错误信息与您的相同

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

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

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

希望这可以帮助别人。

谢谢,但不幸的是,这对我没有帮助。我只是将数组传递给另一个类。我只访问了图书馆一次,我不明白出了什么问题。我不认为我在创造另一个例子,但也许我错了。你能再检查一下我的代码吗?:)您需要将DefaultAssetLibrary方法移动到公共位置,这样库就不会被破坏。应用程序委托或第一个视图控制器(如果它推送选择资源并将其发送回第一个的第二个视图控制器)。(AlassetLibrary*)DefaultAssetLibrary方法charme for me!