iOS的线程
线程是可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位。线程之间共用堆,自有栈,iOS主线程栈大小为1M,其它线程为512K。
iOS有三种多线程编程的技术,分别是:
1.、NSThread
2、CocoaNSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用)
3、GCD 全称:Grand CentralDispatch( iOS多线程编程之GrandCentral Dispatch(GCD)介绍和使用)
这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的。
NSThread
优点:NSThread 比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。
NSOperation
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。
Cocoa operation 相关的类是 NSOperation ,NSOperationQueue。NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类:NSInvocationOperation 和 NSBlockOperation。创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。
GCD
Grand Central Dispatch(GCD)是Apple开发的一个多核编程的解决方法。GCD是一个替代诸如NSThread,NSOperationQueue, NSInvocationOperation等技术的很高效和强大的新技术。
1.NSThread
有三种用法,
(1) 直接创建线程并且开始运行线程:
[NSThreaddetachNewThreadSelector:@selector(threadInMainMethod:) toTarget:selfwithObject:nil];
(2) 先创建线程对象,然后再运行线程操作:
NSThread* myThread =[[NSThread alloc] initWithTarget:self selector:@selector (threadInMainMethod:)object:nil];
[myThread start];
(3)用NSObject的类方法 performSelectorInBackground:withObject: 创建一个线程:
[ObjperformSelectorInBackground:@selector(doSomething) withObject:nil];
2. NSOperation
NSOpertaion有2种形式
(1) 并发执行
并发执行你需要重载如下4个方法
//执行任务主函数,线程运行的入口函数
-(void)start
//是否允许并发,返回YES,允许并发,返回NO不允许。默认返回NO
-(BOOL)isConcurrent
-(BOOL)isExecuting
//是否已经完成,这个必须要重载,不然放在放在NSOperationQueue里的NSOpertaion不能正常释放。
-(BOOL)isFinished
比如TestNSOperation:NSoperaion 重载上述的4个方法,
声明一个NSOperationQueue,
NSOperationQueue *queue= [[[NSOperationQueue alloc ] init] autorelease];
[queueaddOperation:testNSoperation];
它会自动调用TestNSOperation里的 start函数,如果需要多个NSOperation,你需要设置queue的一些属性,如果多个NSOperation之间又依赖关系,也可以设置,具体可以参考API 文档。
(2)非并发执行
-(void)main
只需要重载这个main方法就可以了。
3. GCD
// 后台执行:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// something
});
// 主线程执行:
dispatch_async(dispatch_get_main_queue(), ^{
// something
});
// 一次性执行:
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// code to be executed once
});
// 延迟2秒执行:
double delayInSeconds = 2.0;
dispatch_time_t popTime =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime,dispatch_get_main_queue(), ^(void){
// code to be executed on the mainqueue after delay
});
// 自定义dispatch_queue_t
dispatch_queue_t urls_queue =dispatch_queue_create("blog.devtang.com", NULL);
dispatch_async(urls_queue, ^{
// your code
});
dispatch_release(urls_queue);
// 合并汇总结果
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
// 并行执行的线程一
});
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
// 并行执行的线程二
});
dispatch_group_notify(group,dispatch_get_global_queue(0,0), ^{
// 汇总结果
});
参考下文
http://blog.csdn.net/zhangao0086/article/details/38904923