首页 > 代码库 > iOS中多线程的实现方案

iOS中多线程的实现方案

我去, 好蛋疼, 刚刚写好的博客就因为手贱在触控板上右划了一下, 写的全丢了, 还得重新写, 博客园就没有针对这种情况的解决方案吗?都不想写了

 

一. 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) 第三种方法