Ios 为什么';t ALAssetLibrary-enumerateGroupsWithTypes:usingBlock:“;停止“;我什么时候告诉它?
我注意到,即使我将Ios 为什么';t ALAssetLibrary-enumerateGroupsWithTypes:usingBlock:“;停止“;我什么时候告诉它?,ios,iphone,objective-c,block,alassetslibrary,Ios,Iphone,Objective C,Block,Alassetslibrary,我注意到,即使我将*stopBOOL指针设置为YES,我的枚举块仍会执行两次。我以为设置*stop=YES会在第一次设置之后停止 [lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { NSLog(@"Enumerating a group"); //should stop after first? *stop = YE
*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) {
}];
__block BOOL stopItForReal=否;
[lib enumerateGroupsWithTypes:alassetgroupsavedphotos usingBlock:^(alassetgroup*group,BOOL*stop){
NSLog(@“枚举组”);
//不停止枚举
*停止=是;
//实际上停止了枚举。我赢了,运行时!
如果(停止为真实)
返回;
stopItForReal=是;
}故障块:^(N错误*错误){
}];
当组枚举终止时,将使用
group=nil
调用AlasSetLibraryGroupsEnumeResultsBlock
。所以你可以写这样的东西:
if (group != nil)
{
// your code.
}
AlassetLibraryGroupsEnumeRationalResultsBlock上的Apple文档:
stop
指向布尔值的指针;将该值设置为“是”以停止枚举。是的,这完全有效。非常感谢。多么奇怪的行为。我想苹果之所以选择这样做,一定有一些务实和/或传统的原因。5分钟等待期结束后,我将接受您的回答。实际上,可以使用该功能代替完成块,例如:if(group){[self.array addObject:group];}else{[self.tableView reloadData];}