ALAssetsGroup が大きい場合、enumerateAssetsUsingBlock: または enumerateAssetsAtIndexes: が呼び出されてから最初の列挙ブロックが呼び出されるまでに数秒の遅延があります。
ライブラリに 10000 個のアセットがある iPad 2 では、この遅延は最初のアセット ブロックが呼び出される前に約 4.2 秒です。
同じライブラリを持つ同じデバイス上の Photos.app は、ライブラリ内のすべての写真を表示するのに 1 秒もかかりません。これがどのように行われるのかわかりません。それが私たちが見たいと思っている種類の行動です。
これは、動作を示す最小限のテスト ケースです。
ALAssetsLibrary* assetLibrary = [ALAssetsLibrary new];
[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupLibrary
usingBlock:^(ALAssetsGroup *group, BOOL *stop)
{
if (group != nil) {
NSLog(@"*** Got library group, start timer");
NSDate* tic = [NSDate date];
[group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:0] options:0 usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)
{
if (result==nil) {
NSLog(@"*** Elapsed time to final enumeration: %.2fs", -[tic timeIntervalSinceNow]);
}
else if (index==0) {
NSLog(@"*** Elapsed time to image 0: %.2fs", -[tic timeIntervalSinceNow]);
}
}];
*stop = YES;
}
}
failureBlock:^(NSError *error)
{
NSLog(@"ERROR: %@", [error localizedDescription]);
}];
出力:
*** Got library group, start timer
*** Elapsed time to image 0: 4.20s
*** Elapsed time to final enumeration: 4.20s
(この (わずかに異なる) 質問で受け入れられた解決策は機能しないことに注意してください。最初のアセットに到達する前に遅延が発生します: ALAssetsLibrary からの読み取りと UITableView への入力を高速化する方法)