我正在尝试将块中的结果分配给块变量。这是我的代码:
__block UIImage *latestImage;
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
// Enumerate just the photos and videos group by using ALAssetsGroupSavedPhotos.
[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
usingBlock:^(ALAssetsGroup *group, BOOL *stop){
// Within the group enumeration bl ock, filter to enumerate just photos.
[group setAssetsFilter:[ALAssetsFilter allPhotos]];
// Chooses the photo at the last index
[group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:([group numberOfAssets]-1)]
options:0
usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop){
// the end of the enumeration is signaled by asset == nil.
if (alAsset){
ALAssetRepresentation *representation = [alAsset defaultRepresentation];
latestImage = [UIImage imageWithCGImage:[representation fullResolutionImage]];
}
}];
}
failureBlock: ^(NSError *error){
// handle error
NSLog(@"No groups");
}
];
return latestImage;
我确认变量latestImage是在块中设置的,方法是在块内部的UIImageView上显示它。但是,当我尝试返回上面代码中显示的那个对象时,它什么都不返回。
我错过了什么?
感谢。
答案 0 :(得分:0)
enumerateGroupsWithTypes:usingBlock:failureBlock:
是异步的。在块有机会设置变量之前,您将返回latestImage。从ALAssestsLibrary上的文档:
ALAssetsLibrary声明的许多方法都会失败 作为一个论点。这些方法都是异步的,因为用户 可能需要被要求授予对数据的访问权。
您可以将整个函数包装在dispatch_sync()
中,也可以使用信号量等待答案。无论哪种方式,请确保您没有在主线程上执行此操作。