9

ALAssetsLibrary を使用するのは初めてです。ユーザーが保存したフォト ギャラリーの最新の写真にアクセスする必要があります。これを行うには、ALAssetsLibrary インスタンスを作成し、最後の画像を選択する前に、ユーザーのギャラリー内のすべてのアイテムを反復処理する必要があるようです。これは常に最悪のシナリオです。この問題に取り組むためのより速い/より良い方法はありますか?

4

4 に答える 4

15

ユーザーのギャラリーにあるすべての写真を列挙する必要はありません。ALAssetsGroupクラスには、- (void)enumerateAssetsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock列挙するアセットを示すために使用できるメソッドがあります。

あなたの場合、それは最後のものだけなので、indexSetを[NSIndexSet indexSetWithIndexesInRange:NSMakeRange([group numberOfAssets]-1, [group numberOfAssets])グループがALAssetsGroupである場所に設定します。

@mithuntntが述べたように、次を使用してフォトライブラリのALAssetsGroupを取得できます。[[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop)

于 2011-07-29T10:42:08.047 に答える
1

これはどうですか:

[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
    if (result) {
       *stop = YES;
       //...
    }
}];
于 2012-01-31T02:41:08.650 に答える
0

http://developer.apple.com/library/ios/#documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html

列挙方法は 1 つだけです。したがって、これが唯一の方法です。

最後にインポートした写真が必要でした。これに似たフィルターを使用できます。

[[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if( group )
    {
        NSString * groupName = [group valueForProperty:ALAssetsGroupPropertyName];

        if( [@"Last Import" isEqualToString:groupName] )
        {
            *stop = true;

...

于 2011-07-18T19:26:29.617 に答える
0

ALAssetGroupフィルターを設定した を列挙している場合、受け入れられた回答は機能しないようです(フィルター処理[group numberOfAssets]後の総資産ではなく総資産を返すため)。

私はこれを使用しました:

typedef void(^SMKMostRecentPhotoCompletionBlock)(ALAsset *asset);

- (void)mostRecentPhotoWithCompletionBlock:(SMKMostRecentPhotoCompletionBlock)completionBlock
{
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

    __block ALAsset *mostRecentPhoto = nil;

    if (group)
    {
        [group setAssetsFilter:[ALAssetsFilter allPhotos]];
        [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

            if (result != NULL)
            {
                mostRecentPhoto = result;
                *stop = YES;
            }

        }];
    }

    if (completionBlock)
    {
        completionBlock(mostRecentPhoto);
    }

} failureBlock:^(NSError *error) {

    if (completionBlock)
    {
        completionBlock(nil);
    }

}];

}

completionBlockで、返された ALAsset != nil を確認してください。

于 2014-03-03T18:58:16.487 に答える