Something About NSThread

iOS开发中不能将太耗时的操作放在主线程中执行,否则会造成线程的阻塞。通常解决方案就是将耗时的操作另开一个线程执行。


iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法。下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:

  • Thread :是三种方法里面相对轻量级的,但需要管理线程的生命周期、同步、加锁问题,这会导致一定的性能开销。
  • Cocoa Operations:是基于OC实现的,NSOperation以面向对象的方式封装了需要执行的操作,不必关心线程管理、同步等问题。NSOperation是一个抽象基类,iOS提供了两种默认实现:NSInvocationOperationNSBlockOperation,当然也可以自定义NSOperation。
  • GCD(iOS4才开始支持):提供了一些新特性、运行库来支持多核并行编程,它的关注点更高:如何在多个cpu上提升效率。

一、创建NSthread

NSThread的创建主要有3种直接方式:

[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];  
// 调用完毕后,会马上创建并开启新线程 
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];    
[thread start]; // 开启线程
[self performSelectorInBackground:@selector(run) withObject:nil]; 

第一种会立即创建一个线程来做事情;第二种虽然你 alloc 了也init了,但是要直到我们手动调用start 启动线程时才会真正去创建线程。这种延迟实现思想在很多跟资源相关的地方都有用到,还可以在启动线程之前,对线程进行配置,比如设置stack 大小,线程优先级。第三种间接的方式,更加方便,我们甚至不需要显式编写 NSThread 相关代码。

二、NSthread常用方法:

NSThread *current = [NSThread currentThread]; //获取当前线程
NSThread *main = [NSThread mainThread]; //获取当前主线程
  
[NSThread sleepForTimeInterval:2];  // 暂停2s
NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]];  
[NSThread sleepUntilDate:date];// 暂停2s

三、线程间通信

//主线程上执行操作:
[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES]; 

//当前线程上执行操作:
[self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];

//指定线程上执行操作:
[self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];

所谓线程间通信,即如何从一个线程进入到另一个线程继续执行任务或者是传递参数(如从子线程回到主线程)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.介绍下内存的几大区域? 2.你是如何组件化解耦的? 3.runtime如何通过selector找到对应的IMP...
    小孩仔阅读 1,726评论 0 21
  • .一.进程 进程:是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空...
    IIronMan阅读 4,527评论 1 33
  • Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么? 1...
    AlanGe阅读 1,793评论 0 17
  • 1、简介:1.1 iOS有三种多线程编程的技术,分别是:1.、NSThread2、Cocoa NSOperatio...
    LuckTime阅读 1,374评论 0 1
  • 多线程 在iOS开发中为提高程序的运行效率会将比较耗时的操作放在子线程中执行,iOS系统进程默认启动一个主线程,用...
    郭豪豪阅读 2,617评论 0 4