我去, 好蛋疼, 刚刚写好的博客就因为手贱在触控板上右划了一下, 写的全丢了, 还得重新写, 博客园就没有针对这种情况的解决方案吗?都不想写了
一. iOS中多线程的实现方案有四种
(1) NSThread陷阱非常多, 有缺陷, 不过是OC的, 偶尔用一下
(2) GCD在苹果在iOS4推出的, 能充分利用设备的多核, 而且不用考虑线程, 性能比NSThread好的多
GCD研究起来就比较深了, 所以在面试的时候会经常被问到
(3) NSOperation封装了很多使用的使用的功能, 某些情况下, GCD实现起来比较难的反而用NSOperation实现起来很简单, 苹果推荐大家使用NSOperation
因为NSOperation封装的非常好, 所以使用起来非常简单, 没有什么技术难度, 在面试中就不怎么问
二. NSThread使用方法
NSThread使用起来简单, 比较灵活
(1)通用的方法:currentThread
NSThread *thread = [NSThread currentThread];
当前线程, 在所有的(指NSThread\GCD\NSOpertion)多线程技术中都可以使用来获得当前线程
(2) 第一种方法, 最简单的一种
/** 不带参数的实例化initWithTarget方法 */
// 1. 实例化线程对象, run 是一个耗时的任务,放在其他线程工作,就不会影响主线程了! NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; // 2. 启动线程,会立即调用run方法 [thread start];
实例化一个线程对象, 把耗时任务放在其它线程
必须start才会执行run方法
/** 带参数的实例化initWithTarget方法 */
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"hehe"]; thread.name = @"thread initWithTarget";
注意, 带参数@selector(run:)加冒号
可以设置thread对象的name属性
(3) 第二种方法
/** 不带参数的detach方法 */
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
- (void)run
会立即启动新的线程, 运行run方法
/** 带参数的detach方法 */
// object是调用方法的第一个参数 [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"hello"];
- (void)run:(id)obj
注意, 带参数@selector(run:)加冒号
(4) 第三种方法