NSThread
常规使用场景
/** 启动一个线程*/
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(method) object:nil];
[thread setName:@"YtCui"];
[thread start];
[thread cancel];
/** 自启动*/
[NSThread detachNewThreadSelector:@selector(method) toTarget:self withObject:nil];
/** 系统封装便捷的线程操作*/
[self performSelectorInBackground:@selector(method) withObject:nil];
/**
* 在——thread1上运行method方法
* thread1不能提前推出(runloop保活)
*/
[self performSelector:@selector(method) onThread:_thread1 withObject:nil waitUntilDone:YES];
/**
* 在主线程中跑method方法
* 主线程默认会有runloop在执行
*/
[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];
NSOperation& NSOperationQueue
operation objects 添加到operationqueue中自动执行
NSOperation
1.它是一个抽象类,无法直接使用需要继承实现它的子类
2.另外提供NSInvocationOperation和NSBlockOperation可以直接使用的类,NSInvocationOperation只能绑定一个方法和对象,blockOperation可以通过addExecutionBlock:来添加更多的代码块,这些代码都作为一个block去执行。
3.operation默认是同步执行,通过isAsynchronous修改是否异步执行。只需operation加入queue后,会并发执行operation
4.通过cancel方法取消operation执行,中途取消
5.通过completionBlock设置完成后执行的操作
6.通过重写main方法,实现自定义的operation,异步operation时候不会走系统的自动释放池main中用@autoreleasepool {}
7.operation objects可以添加依赖,不能添加相互依赖否则
8.operation可以设置优先级,值域【0,1】
- KVO通知来监控operation的执行状态(重写main)
- 支持取消,中止任务(重写main)
NSBlockOperation *operationblock = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Hello man %@",[NSThread currentThread]);
}];
[operationblock addExecutionBlock:^{
NSLog(@"NO");
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operationblock];
NSInvocationOperation *inOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(method) object:nil];
[inOperation start];
NSOperationQueue
1.operation添加到queue中后无需手动启动,queue默认为operation开辟线程异步执行。
2.queue可以设置最大的运行线程数量,
3.取消所有线程操作
4.queue可以先暂停所有操作,但正在执行当中的操作不会被取消,而是直接运行,待运行结束
GCD
GCD是Grand Central Dispatch的简称,它是基于C语言的。完全由系统管理线程,我们不需要编写线程代码。只需定义想要执行的任务,然后添加到适当的调度队列(dispatch queue),
dispatch_queue_t
1.自己可以创建任意多个queue,按照FIFO顺序执行,serial dispatch queue一次只能执行一个任务,concurrent dispatch queue尽可能多的启动任务并发执行。(并发数目有系统环境决定)
2.main queue 主线程queue,可以向主线程添加部分事件如:界面刷新等,dispatch_get_main_queue获得应用主线程,主线程中任务串行执行
3.global queue:全局并发队列,由系统默认生成,无法调用dispatch_resume()和dispatch_suspend(),提供四个优先级(从高到低):DISPATCH_QUEUE_PRIORITY_HIGH,DISPATCH_QUEUE_PRIORITY_DEFAULT,DISPATCH_QUEUE_PRIORITY_LOW,DISPATCH_QUEUE_PRIORITY_BACKGROUND;
/**
* label为queue的名称,attr生命queue是串行队列还是并发队列,默认为NULL为串行队列
*/
dispatch_queue_create(<#const char * _Nullable label#>, <#dispatch_queue_attr_t _Nullable attr#>)
dispatch_queue_t concurrentQueue = dispatch_queue_create("cyt.con.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t serilQueue = dispatch_queue_create("cyt.ser.queue",NULL);
dispatch_async(concurrentQueue, ^{
NSLog(@"do it");
});
dispatch_async(serilQueue, ^{
NSLog(@"do it");
});