objective-c多线程编程的几种方法
2014-05-23 15:50
288 查看
在开发中,我们经常会使用线程去处理一些问题,比如耗时的操作,并发执行的操作等。使用线程会让程序变得更有效率。简单记录下三种多线程编程,如有错误或不足,欢迎指正。
第一种方式:使用NSThread。
第二种方式:使用NSOperation。
第三种方式:使用GCD。即Grand Central Dispatch。
1,NSThread使用
NSThread初始化,可以使用对象方法- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
第一个参数:指定的selector发送的目标对象,第二个参数:指定方法名,第三个参数:方法自带的参数。参数只能是一个并且方法不能有返回值。
通过初始化的NSThread的对象再调用-(void)start就可以启动这个线程。
还可以使用类方式去初始化并且立马启动线程。+(void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
三个参数与上面一样。还有其他一些方法可以参考苹果官方文档对NSThread类的详细描述。
这种方式的线程同步时需要考虑到死锁问题。
2,NSOperation的使用。
这种方式一般来说需要写一个NSOperation的子类,在子类中重写-(void)main方法。main方法就是你需要去处理的操作。最后需要把NSOperation对象,加入到NSOperationQueue里面去。还可以使用NSOperation的子类,NSInvocationOperation,初始化NSInvocationOperation
:- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg
参数与NSThread一样,完成初始化之后把NSInvocationOperation添加到NSOperationQueue里面去。
3,GCD使用
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),
^{
这里就是你写code需要去处理的事情
if (得到你想要的结果) {
dispatch_async(dispatch_get_main_queue(), ^{
这里面就去刷新界面
});
}
});
还有几个比较重要的函数,dispatch_group_async,dispatch_group_async,dispatch_barrier_async
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"线程一去做的事情");
});
dispatch_group_async(group, queue, ^{
NSLog(@"线程二去做的事情");
});
dispatch_group_async(group, queue, ^{
NSLog(@"线程三去做的事情");
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
NSLog(@"所有线程都完成了任务,可以通知主线程更新界面了");
});
dispatch_queue_t queue =dispatch_queue_create("test",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"开启线程1");
});
dispatch_async(queue, ^{
NSLog(@"开启线程2");
});
dispatch_barrier_async(queue, ^{
NSLog(@"上面两个线程完成任务,开启我自己,我自己就叫线程3吧");
});
dispatch_async(queue, ^{
NSLog(@"等线程3完成了再开启我,我叫线程4");
});
由于翻译英语水平有限,翻译的也不是很准确,就不翻译了。一般来说,当你开启线程去处理某些问题的时候,在刷新界面则放到主线程里面去做。可以调用NSObject的Category方法,如下。
id item;
[selfperformSelectorOnMainThread:@selector(updateUI:)withObject:item
waitUntilDone:YES];
第一种方式:使用NSThread。
第二种方式:使用NSOperation。
第三种方式:使用GCD。即Grand Central Dispatch。
1,NSThread使用
NSThread初始化,可以使用对象方法- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
第一个参数:指定的selector发送的目标对象,第二个参数:指定方法名,第三个参数:方法自带的参数。参数只能是一个并且方法不能有返回值。
通过初始化的NSThread的对象再调用-(void)start就可以启动这个线程。
还可以使用类方式去初始化并且立马启动线程。+(void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
三个参数与上面一样。还有其他一些方法可以参考苹果官方文档对NSThread类的详细描述。
这种方式的线程同步时需要考虑到死锁问题。
2,NSOperation的使用。
这种方式一般来说需要写一个NSOperation的子类,在子类中重写-(void)main方法。main方法就是你需要去处理的操作。最后需要把NSOperation对象,加入到NSOperationQueue里面去。还可以使用NSOperation的子类,NSInvocationOperation,初始化NSInvocationOperation
:- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg
参数与NSThread一样,完成初始化之后把NSInvocationOperation添加到NSOperationQueue里面去。
3,GCD使用
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),
^{
这里就是你写code需要去处理的事情
if (得到你想要的结果) {
dispatch_async(dispatch_get_main_queue(), ^{
这里面就去刷新界面
});
}
});
还有几个比较重要的函数,dispatch_group_async,dispatch_group_async,dispatch_barrier_async
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"线程一去做的事情");
});
dispatch_group_async(group, queue, ^{
NSLog(@"线程二去做的事情");
});
dispatch_group_async(group, queue, ^{
NSLog(@"线程三去做的事情");
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
NSLog(@"所有线程都完成了任务,可以通知主线程更新界面了");
});
dispatch_queue_t queue =dispatch_queue_create("test",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"开启线程1");
});
dispatch_async(queue, ^{
NSLog(@"开启线程2");
});
dispatch_barrier_async(queue, ^{
NSLog(@"上面两个线程完成任务,开启我自己,我自己就叫线程3吧");
});
dispatch_async(queue, ^{
NSLog(@"等线程3完成了再开启我,我叫线程4");
});
由于翻译英语水平有限,翻译的也不是很准确,就不翻译了。一般来说,当你开启线程去处理某些问题的时候,在刷新界面则放到主线程里面去做。可以调用NSObject的Category方法,如下。
id item;
[selfperformSelectorOnMainThread:@selector(updateUI:)withObject:item
waitUntilDone:YES];
相关文章推荐
- Python并发编程之创建多线程的几种方法(二)
- 多线程编程的几种方法
- Python并发编程之创建多线程的几种方法(二)
- windows编程中文件操作的几种方法
- Java6学习笔记55——多线程编程——线程的创建方法1
- P89LPC932的几种ISP编程方法
- java多线程编程 - 基础篇(四)[wait(),notify()/notityAll()方法]
- Java应用程序本地编译为EXE的几种方法-Java基础-Java-编程开发
- 如何使用编程的方法--创建1.44兆软盘镜像的几种方法。。。(之二 汇编)
- 多线程有几种表示方法,都是什么?同步有几种实现方法,都是什么?
- VC多线程中控制界面控件的几种方法
- 《Java面向对象编程》学习笔记10——多线程中线程放弃运行态的几种方法
- sps编程模型中打开站点的几种方法
- JAVA多线程编程的几种表示方法
- 如何使用编程的方法--创建1.44兆软盘镜像的几种方法。。。(之一 C语言法)
- Java6学习笔记56——多线程编程——线程的创建方法2
- 架构与模式:多线程有几种常用的编程模型
- 多线程编程 -wait(),notify()/notityAll()方法
- SQL Server数据表在编程中实现导出EXCEL的几种方法
- 多线程的几种实现方法详解