博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用GCD处理非UI相关的异步任务 Object-C异步多线程加载网络图片
阅读量:5225 次
发布时间:2019-06-14

本文共 2672 字,大约阅读时间需要 8 分钟。

两个核心方法:dispatch_async和dispatch_async_f,分别对应Block Objects方法和C Functions方法。

我们举一个场景来进行:

当我们需要从网络下载一个图片,可以将这个下载工作丢到一个异步线程里面,然后当图片下载完毕后,我们再交给主线程,让主线程去显示这个图片。在这种场景下,我们就需要甬道异步任务了。这里也涉及到了之前提到的__block方式操作本地资源。

代码演示如下:

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(concurrentQueue, ^{    __block UIImage *image = nil;    dispatch_sync(concurrentQueue, ^{         /* Download the image here */    });    dispatch_sync(dispatch_get_main_queue(), ^{        /* Show the image to the user here on the main queue*/    }); });

 

 

下面看一个具体的代码实现:

- (void) viewDidAppear:(BOOL)paramAnimated{    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    dispatch_async(concurrentQueue, ^{         __block UIImage *image = nil;        dispatch_sync(concurrentQueue, ^{             /* Download the image here */            /* iPad's image from Apple's website. Wrap it into two lines as the URL is too long to fit into one line */            NSString *urlAsString = @"http://images.apple.com/mobileme/features"\ "/images/ipad_findyouripad_20100518.jpg";            NSURL *url = [NSURL URLWithString:urlAsString];            NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];            NSError *downloadError = nil;            NSData *imageData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&downloadError];            if (downloadError == nil && imageData != nil){                image = [UIImage imageWithData:imageData]; /* We have the image. We can use it now */            }            else if (downloadError != nil){                NSLog(@"Error happened = %@", downloadError);             }             else             {                NSLog(@"No data could get downloaded from the URL.");             }        });        dispatch_sync(dispatch_get_main_queue(), ^{            /* Show the image to the user here on the main queue*/            if (image != nil){                /* Create the image view here */                UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];                /* Set the image */                 [imageView setImage:image];                /* Make sure the image is not scaled incorrectly */                 [imageView setContentMode:UIViewContentModeScaleAspectFit];                /* Add the image to this view controller's view */                 [self.view addSubview:imageView];            } else {                NSLog(@"Image isn't downloaded. Nothing to display.");            }         });    }); }

 

 

转载于:https://www.cnblogs.com/DamonTang/archive/2012/12/13/2816452.html

你可能感兴趣的文章
读书_2019年
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>
空间分析开源库GEOS
查看>>
RQNOJ八月赛
查看>>
关于ajax回调数据类型为Json,如何获得他的值
查看>>
前端各种mate积累
查看>>
jQuery 1.7 发布了
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>
name phone email正则表达式
查看>>
721. Accounts Merge
查看>>
Linux下使用pip安装keras
查看>>
OpenCv-Python 图像处理基本操作
查看>>
博物院与国宝
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>