NSThread

NSThread 是苹果官方提供的,使用起来比 pthread 更加面向对象,简单易用,可以直接操作线程对象。不过也需要需要程序员自己管理线程的生命周期(主要是创建),我们在开发的过程中偶尔使用 NSThread。比如我们会经常调用[NSThread currentThread]来显示当前的进程信息。

NSThread有三种创建方式:

• init方式
• detachNewThreadSelector创建好之后自动启动
• performSelectorInBackground创建好之后也是直接启动

/** 方法一,需要start */

NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething1:) object:@"NSThread1"];
// 线程加入线程池等待CPU调度,时间很快,几乎是立刻执行
[thread1 start];

/** 方法二,创建好之后自动启动 */

[NSThread detachNewThreadSelector:@selector(doSomething2:) toTarget:self withObject:@"NSThread2"];

/** 方法三,隐式创建,直接启动 */

[self performSelectorInBackground:@selector(doSomething3:)
withObject:@"NSThread3"];
- (void)doSomething1:(NSObject *)object {
    // 传递过来的参数
    NSLog(@"%@",object);
    NSLog(@"doSomething1:%@",[NSThread currentThread]);
}
 
- (void)doSomething2:(NSObject *)object {
    NSLog(@"%@",object);
    NSLog(@"doSomething2:%@",[NSThread currentThread]);
}
 
- (void)doSomething3:(NSObject *)object {
    NSLog(@"%@",object);
    NSLog(@"doSomething3:%@",[NSThread currentThread]);
}

NSThread的类方法

• 返回当前线程

// 当前线程
[NSThread currentThread];
NSLog(@"%@",[NSThread currentThread]);

// 如果number=1,则表示在主线程,否则是子线程

打印结果:{number = 1, name = main}

• 阻塞休眠

//休眠多久
[NSThread sleepForTimeInterval:2];
//休眠到指定时间
[NSThread sleepUntilDate:[NSDate date]];

• 类方法补充

//退出线程
[NSThread exit];
//判断当前线程是否为主线程
[NSThread isMainThread];
//判断当前线程是否是多线程
[NSThread isMultiThreaded];
//主线程的对象
NSThread *mainThread = [NSThread mainThread];

NSThread的一些属性

//线程是否在执行
thread.isExecuting;
//线程是否被取消
thread.isCancelled;
//线程是否完成
thread.isFinished;
//是否是主线程
thread.isMainThread;
//线程的优先级,取值范围0.0到1.0,默认优先级0.5,1.0表示最高优先级,优先级高,CPU调度的频率高
thread.threadPriority;

NSThread线程之间的通信

下面通过一个经典的下载图片 DEMO 来展示线程之间的通信。具体步骤如下:

  1. 开启一个子线程,在子线程中下载图片。
  2. 回到主线程刷新 UI,将图片展示在 UIImageView 中。
    DEMO 代码如下:
/** * 创建一个线程下载图片 */ 
- (void)downloadImageOnSubThread { 
    // 在创建的子线程中调用downloadImage下载图片 
    [NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil]; 
}

/** * 下载图片,下载完之后回到主线程进行 UI 刷新 */ 
- (void)downloadImage { 
    NSLog(@"current thread -- %@", [NSThread currentThread]); 
    // 1. 获取图片 imageUrl 
    NSURL *imageUrl = [NSURL URLWithString:@"https://ysc-demo-1254961422.file.myqcloud.com/YSC-phread-NSThread-demo-icon.jpg"]; 
    // 2. 从 imageUrl 中读取数据(下载图片) -- 耗时操作 
    NSData *imageData = [NSData dataWithContentsOfURL:imageUrl]; 
    // 通过二进制 data 创建 image 
    UIImage *image = [UIImage imageWithData:imageData]; 
    // 3. 回到主线程进行图片赋值和界面刷新 
    [self performSelectorOnMainThread:@selector(refreshOnMainThread:)withObject:image waitUntilDone:YES]; 
} 
/** * 回到主线程进行图片赋值和界面刷新 */ 
- (void)refreshOnMainThread:(UIImage *)image { 
    NSLog(@"current thread -- %@", [NSThread currentThread]); 
    // 赋值图片到imageview 
    self.imageView.image = image;
 }

站在巨人的肩膀上学习!如有侵权,请联系删除

你可能感兴趣的:(NSThread)