我有以下内容:
__block ALAssetsGroup* album = nil;
ALAssetsLibrary* library = [ALAssetsLibrary new];
[library enumerateGroupsWithTypes: ALAssetsGroupAlbum
usingBlock:
^ (ALAssetsGroup *group, BOOL *stop) {
if (group) {
NSString* title =
[group valueForProperty: ALAssetsGroupPropertyName];
if ([title isEqualToString: @"Test1"]) {
album = group;
*stop = YES;
NSLog(@"sd%@", album.description);
}
} else { // afterwards
self.images = [self showFirstPhotoOfGroup:album]; // (oreilly, programming ios 7, ch.17)
NSLog(@"A:%d",[_images count]); // return photo count
if (!album) {
NSLog(@"%@", @"failed to find album");
return;
}
}
}
];
NSLog(@"B:%d",[_images count]);
NSLog A:正确显示相册中的项目数为2。
NSLog B:显示0.事实上,它在块之前被处理了!
我理解为什么会这样做 - 但这是Apple提供的例子。请问你能告诉我如何获得_images来保持它在块之外的价值。它似乎有一个完全不同的范围。
我一直试图将一张专辑加载到一个阵列中很长时间 - 但是这个块示例并没有将它的值保留在块外!
答案 0 :(得分:1)
答案的线索在于您自己的观察 - NSLog B在 NSLog A之前处理。方法enumerateGroupsWithTypes:usingBlock:failureBlock
被记录为 asynchrnous ,所以它可以在枚举任何内容之前返回。因此,您的问题与保留的值等无关,而只是在工作完成之前您正在寻找结果。
您必须设计应用程序,以便在枚举完成后完成依赖于枚举的任何操作。 enumerateGroupsWithTypes
的文档指出在枚举完成后,块将再次被调用并传递nil
,您需要对其进行测试并使用它来触发相关操作。
HTH