我有一个API连接器,可以从API异步下载图像(基本上是围绕SDWebImageManager的智能包装)。这完全符合我的目的,除了在一个罕见的实例中我需要使用图像幻灯片数据源委托中的图像,它需要返回UIImage:
- (UIImage*)slideShow:(KASlideShow *)slideShow imageForPosition:(KASlideShowPosition)position
{
return [self randomImageFromConfig];
}
所以我尝试使用信号量来封装我的块调用,以便在幻灯片数据源方法完成之前确保返回图像:
- (UIImage*)randomImageFromConfig
{
__block UIImage* returnImage;
NSMutableArray* slideShowImages = [[kGlobalRemoteConfig valueForKeyPath:@"images.home"] mutableCopy];
if (slideShowImages && slideShowImages.count > 0)
{
[slideShowImages shuffle];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[ImageDownloader imageForId:slideShowImages[0] collection:@"images" operation:nil completion:^(UIImage *image, NSError *error) {
returnImage = image;
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
return returnImage;
}
但这似乎阻止了主线程?这与我调用SDWebImage的底层方法有什么关系吗?或者我只是愚蠢?如何让这个块操作起作用?或者有更好的方法来处理这个数据源吗?