为什么ALAssetLibrary -enumerateGroupsWithTypes:usingBlock:当我告诉它时“停止”?

时间:2014-03-05 20:36:07

标签: ios iphone objective-c block alassetslibrary

我注意到即使我将*stop BOOL指针设置为YES,我的枚举块也会被执行两次。我认为设置*stop = YES会在第一个之后停止吗?

[lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    NSLog(@"Enumerating a group");

    //should stop after first?
    *stop = YES; 
} failureBlock:^(NSError *error) {
}];

日志:

2014-03-05 12:27:29:363 AppName[3625:1547] Enumerating a group
2014-03-05 12:27:29:379 AppName[3625:1547] Enumerating a group

从文档中,-enumerateGroupsWithTypes:usingBlock:是异步的,但它是否也自动并行化?两个枚举都发生在主线程上,所以也许我应该强制执行自己的停止?如果没有按照文档建议的方式严格执行,那么提供stop似乎很奇怪。

修改

为了它的价值,我加入了自己的执法,并且它有效。但为什么我需要这样做?

    __block BOOL stopItForReal = NO;
    [lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        NSLog(@"Enumerating a group");

        //does not stop enumeration
        *stop = YES;

        //actually stops enumeration. I win, runtime!
        if (stopItForReal)
            return;
        stopItForReal = YES;

    } failureBlock:^(NSError *error) {
    }];

1 个答案:

答案 0 :(得分:3)

当群组枚举终止时,ALAssetsLibraryGroupsEnumerationResultsBlock会调用group = nil。所以你可以这样写:

if (group != nil) 
{
    // your code.
}