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底层探索之多线程(十三)—锁的种类你知多少?

iOS底层探索之多线程—GCD源码分析(栅栏函数)

iOS底层探索之多线程—GCD源码分析(函数的同步性异步性单例)

iOS之多线程

iOS底层探索之多线程—GCD源码分析(事件源dispatch_source)

iOS底层探索之多线程—GCD不同队列源码分析