我希望能够从解析中检索图像:
-(UIImage *) image {
__block NSData * imageData;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self.imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
imageData = data;
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return [UIImage imageWithData:imageData];
}
但是由于块在邮件线程上执行并且信号量正在主线程上等待,因此永远不会执行该块。我怎样才能重做我的代码?我需要能够返回没有completionBlock的图像,因为这个方法是由我使用的库调用的。
答案 0 :(得分:1)
您可以尝试使用GCD,在后台解析和加载,然后使用主线程中的图像。 代码可能如下:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *image = nil;
__block NSData *imageData;
[self.imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
imageData = data;
}];
image = [UIImage imageWithData:imageData];
dispatch_sync(dispatch_get_main_queue(), ^{
if (image) {
return image; // use your image here.
}
});
});
答案 1 :(得分:0)
完成块在主线程上运行...被阻塞等待你的信号量。你这里有僵局。您是否考虑在后台线程中使用同步getData来获取信息?