iphone多线程编程GCD
iphone开发过程中,如果遇到加载大数据或者涉及到网络通信情况时,就需要在后台线程来完成这些事情。
除了NSThread之外,iphone还提供了一套GCD机制帮助开发者来实现多线程开发。
同NSThread相比,GCD的运行效率更高,开发更简单。
GCD的基础是dispatch queue和block。
1. block可以简单理解为一个任务。block在程序中的表现形式类似:
1 NSString * URL = @"......";
2
3 ^{
4
5 UIImage * image = [UIImage imageWithURL:URL];
6
7 };
从上例可以看出,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的顺序执行。
下面是一段异步加载网络图像的例子:
1 UIImageView * imageView = [[UIImageView alloc] init];
2
3 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
4
5 UIImage * image = ;//网络拉取代码
6
7 dispatch_async(dispatch_get_main_queue (), ^{
8
9 imageView.image = image; // 在主线程中更新imageview
10
11 });
12
13 });
从以上代码可以看出,GCD的前后台线程同步通知机制要比NSThread优雅和方便很多。
apple官方文档请参考:
http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html
其他资料:
http://www.2cto.com/kf/201111/112639.html
作者 dongliqian
相关新闻>>
- 发表评论
-
- 最新评论 更多>>