iOS之多线程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS之多线程相关的知识,希望对你有一定的参考价值。
关于多线程的大概原理,相信大家都有所了解,我就不再赘述了,多线程的实现有多重方式:NSThread、NSObject、NSOperation和GCD,其中较常用的是GCD,下面分别介绍一下基础操作:
首先NSThread开辟子线程:
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(sayHi) object:nil];//手动开启子线程
[thread start];
[NSThread exit];//使用NSThread和NSObject实现的开辟线程,系统会自动释放,关不关都行
NSThread自动开辟子线程:[NSThread detachNewThreadSelector:@selector(sayHi) toTarget:self withObject:nil];
#pragma mark - NSObject 开启子线程
[self performSelectorInBackground:@selector(sayHi) withObject:@"test"];//开辟子线程:sayHi方法在子线程中实现
[self performSelectorOnMainThread:@selector(mainThreadChangeColor) withObject:nil waitUntilDone:YES];//返回到主线程
#pragma mark - NSOperation——————NSOperation不能直接进行多线程的创建,需要借助:NSOperationQueue
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test) object:nil];//使用NSOperarion的第一个子类去创建多线程:NSInvocationOperation
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"我是子线程");
}];//使用NSOperation 的第二个子类创建子线程(这里可以只使用其中一个子类):若单独使用(不使用NSOperationQueue,只开辟一个子线程)需要添加开启方法:[blockOperation start];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
[queue addOperation:blockOperation];
#pragma mark - GCD
dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_SERIAL, 0);//开辟子线程:串行队列
dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);//开辟子线程:并行队列,串行与并行任选一个
//添加任务(若有多个任务时)//创建串行队列:DISPATCH_QUEUE_SERIAL串行:任务顺序执行;DISPATCH_QUEUE_CONCURRENT并行:任务没有次序
dispatch_async(queue, ^{
NSLog(@"currentThread1 == %@, mainThread1 == %@, ismain == %d", [NSThread currentThread], [NSThread mainThread], [NSThread isMainThread]);//这里的部分将会在子线程下实现
dispatch_async(dispatch_get_main_queue(), ^{
//返回主线程。这里的部分将会在主线程下实现。一般数据的解析加载在子线程中实现,UI的刷新在主线程中实现,最后会举了简单的小例子说明一下
});
});
#++++++解析数据并刷新UI
//url
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
//创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//创建session
NSURLSession *session = [NSURLSession sharedSession];
//创建task
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
//处理数据
//回到主线程刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
});
}
}];
NSOperationQueue与 GCD的比较:
NSOperationQueue使用addOperation方法将NSOperation类型的对象加入队列,并且该NSOperation类型的对象是NSOperation的子类创建的对象(NSInvocationOperation和NSBlockOperation);使用NSOperationQueue时不能出现start方法;
GCD:使用dispatch_queue_create方法创建子线程:根据该方法内的参数的不同从而创建串行队列(DISPATCH_QUEUE_SERIAL)和并行队列(DISPATCH_QUEUE_CONCURRENT);
使用dispatch_async添加任务;
CGD的应用比较广泛,这里只是对其基本使用做了介绍,想深入了解的找度娘吧
以上是关于iOS之多线程的主要内容,如果未能解决你的问题,请参考以下文章
iOS底层探索之多线程—GCD源码分析(函数的同步性异步性单例)