ALAssetsLibrary を使用するのは初めてです。ユーザーが保存したフォト ギャラリーの最新の写真にアクセスする必要があります。これを行うには、ALAssetsLibrary インスタンスを作成し、最後の画像を選択する前に、ユーザーのギャラリー内のすべてのアイテムを反復処理する必要があるようです。これは常に最悪のシナリオです。この問題に取り組むためのより速い/より良い方法はありますか?
4 に答える
ユーザーのギャラリーにあるすべての写真を列挙する必要はありません。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)
これはどうですか:
[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result) {
*stop = YES;
//...
}
}];
列挙方法は 1 つだけです。したがって、これが唯一の方法です。
最後にインポートした写真が必要でした。これに似たフィルターを使用できます。
[[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if( group )
{
NSString * groupName = [group valueForProperty:ALAssetsGroupPropertyName];
if( [@"Last Import" isEqualToString:groupName] )
{
*stop = true;
...
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 を確認してください。