当 ALAssetsGroup 很大时,从调用 enumerateAssetsUsingBlock: 或 enumerateAssetsAtIndexes: 到调用第一个枚举块的时间之间会有几秒钟的延迟。
在库中有 10000 个资产的 iPad 2 上,此延迟大约是调用第一个资产块之前的 4.2 秒。
具有相同库的同一设备上的 Photos.app 将在不到一秒的时间内启动,显示库中的所有照片。我不知道它是怎么做到的。这就是我们希望看到的行为。
这是一个显示行为的最小测试用例:
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 的可能方法)