作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个自定义 View Controller 类,它显示带有注释的 map 。按下注释时,会显示一个标注,并且在注释标注的左侧会显示一个缩略图。此类要求委托(delegate)人提供显示的图像。
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
[(UIImageView *)view.leftCalloutAccessoryView setImage:[self.delegate mapViewController:self imageForAnnotation:view.annotation]];
}
- (UIImage *)mapViewController:(MapViewController *)sender imageForAnnotation:(id<MKAnnotation>)annotation
{
NSURL *someURL = [[NSURL alloc] initWithString:@"a URL to data on a network"];
__block UIImage *image = [[UIImage alloc] init];
dispatch_queue_t downloader = dispatch_queue_create("image downloader", NULL);
dispatch_async(downloader, ^{
NSData *imageData = [NSData dataWithContentsOfURL:someURL]; // This call can block the main UI!
image = [UIImage imageWithData:imageData];
});
return image;
}
最佳答案
您正在创建一个异步执行的 block 。这意味着您的代码创建了要执行的 block ,然后立即返回“图像”,它指向您在初始化变量时创建的新图像:__block UIImage *image = [[UIImage alloc] init];
请记住,当您从一个方法返回一个对象时,您实际上只是返回了一个指向该对象的指针。
在返回指向这个新图像的指针之后的某个时间。该 block 运行并将指向它检索到的图像的指针分配给局部变量“图像”,该变量现在超出了该方法的范围(尽管该 block 仍然具有它)。因此,现在该 block 具有对它获得的图像的此引用,但是当该 block 完成时该引用将消失。
解决此问题的一种方法是同步运行该 block ,但这会破坏分派(dispatch)图像检索过程的意义。您需要做的是为检索到图像后可以调用的函数提供一个 block ,即将图像分配到需要的位置。这看起来像这样:
- (void)mapViewController:(MapViewController *)sender imageForAnnotation:(id<MKAnnotation>)annotation withImageBlock:(void (^)(UIImage *))block{
{
NSURL *someURL = [[NSURL alloc] initWithString:@"a URL to data on a network"];
__block UIImage *image = [[UIImage alloc] init];
dispatch__object_t currentContext = dispatch_get_current_queue();
dispatch_queue_t downloader = dispatch_queue_create("image downloader", NULL);
dispatch_async(downloader, ^{
NSData *imageData = [NSData dataWithContentsOfURL:someURL]; // This call can block the main UI!
image = [UIImage imageWithData:imageData];
dispatch_async(currentContext, ^{
block(image);
});
});
}
关于iphone - 返回使用 GCD 在单独线程中检索到的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857146/
我是一名优秀的程序员,十分优秀!