(转载)iphone多线程编程 GCD

iphone多线程编程 GCD

 

转载自:http://www.cnblogs.com/dongliqian/archive/2011/11/30/2268478.html

 

iphone开发过程中,如果遇到加载大数据或者涉及到网络通信情况时,就需要在后台线程来完成这些事情。

除了NSThread之外,iphone还提供了一套GCD机制帮助开发者来实现多线程开发。

同NSThread相比,GCD的运行效率更高,开发更简单。

GCD的基础是dispatch queue和block。

 

 

1. block可以简单理解为一个任务。block在程序中的表现形式类似 : 

 NSString * URL = @"......";
 
 ^{ 
 
     UIImage * image = [UIImage imageWithURL:URL];
 
 };
 

从上例可以看出,block可以引用外部作用域的数据。这也是很block和普通函数的区别,block会保存当前执行的上下文。

 

2. dispatch queue是一个FIFO任务队列,可以将一些block压入这个队列中,系统会按照顺序来执行这些block。

dispatch_async()

系统中默认提供了三种dispatch queue:

a. Main. 如果某个block希望在主线程完成,可以将其push到main dispatch queue中。

b. Concurrent. 系统会自动创建三个不同优先级的dispatch queue。不能保证block严格按照顺序执行。

c. Serial. 需要用户手动创建,能够保证block严格按照push的顺序执行。

 

下面是一段异步加载网络图像的例子:

UIImageView * imageView = [[UIImageView alloc] init];
 
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 
     UIImage * image = ;//网络拉取代码
 
     dispatch_async(dispatch_get_main_queue (), ^{
 
       imageView.image = image; // 在主线程中更新imageview
 
     });
 
   });
 

从以上代码可以看出,GCD的前后台线程同步通知机制要比NSThread优雅和方便很多。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值