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、いずれも独自のALAssetsLibrary.

于 2013-06-08T20:47:47.017 に答える
1

私も同じ問題を抱えてる。そして、私はついにそれを解決しました。

これが私の条件です: 私は 2 つのコントローラーを持っています。最初のものでは、次のコードを使用してライブラリを初期化しました。

let library = ALAssetsLibrary()

すべてのグループ情報を配列に入れて、2 番目のビュー コントローラーで使用できるようにします。ただし、これにより、グループ内の写真がなくなる可能性があります。

エラーメッセージはあなたのものと同じです。

これは、ライブラリがシステムによって解放されるためです。また、すべての写真情報は、所有する ALAssetsLibrary の存続期間中のみ有効です。したがって、group.numberOfAssets() は 0 になります。

解決策は、最初のコントローラ リリースの前にライブラリがリリースされないようにすることです。したがって、次のコードを使用します。

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

これが誰かを助けることを願っています。

于 2015-05-14T10:08:24.533 に答える