iOS 中的多线程总结

iOS中有4中多线程操作方式,分别是:NSObject多线程技术 、NSThread的多线程技术 、 NSOperation,面向对象的多线程技术 、 GCDC语言实现的多线程技术。接下分别总结这几种方式的用法

一、  NSObject多线程技术

因为iOS中的所有类都是NSObjcet的子类,所以任何类都能够进行如下操作:

 1> 使用performSelectorInBackground可以开启后台线程,执行selector选择器选择的方法

 2> 使用performSelectorOnMainThread可以重新回到主线程执行任务,通常用于后台线程更新界面UI时使用

 3> [NSThread sleepForTimeInterval:1.0f];

    让当前线程休眠,通常在程序开发中,用于模拟耗时操作,以便跟踪不同的并发执行情况!

 

 提示:使用performSelectorInBackground也可以直接修改UI,但是一定要在主线程中修改UI。

 

 注意:在使用NSThread或者NSObject的线程方法时,一定要使用自动释放池,否则容易出现内存泄露。


实例代码:

UITextField *field = [[UITextField alloc] init];
    field.text = @"Programing is fun";
    NSLog(@"执行前:%@", [NSThread currentThread]);
    
    [self performSelectorInBackground:@selector(threadTest1) withObject:nil];
    //必须调用对象本身实现了的方法
    [field performSelectorInBackground:@selector(setPlaceholder:) withObject:@"线程"];


- (void)threadTest1
{
    @autoreleasepool {
        
        NSLog(@"执行后:%@", [NSThread currentThread]);
    }

}


二、 NSThread的多线程技术

 1> 类方法创建线程后直接启动

    detachNewThreadSelector

 

 2> 成员方法,在实例化线程对象之后,调用start方法启动线程

    initWithTarget

 

 对于NSThread的简单使用,可以用NSObjectperformSelectorInBackground替代

 

 同时,在NSThread调用的方法中,同样要使用autoreleasepool进行内存管理,否则容易出现内存泄露。


代码实例:

<pre name="code" class="objc">//新建一个后台线程,调用目标的@selector方法
    [NSThread detachNewThreadSelector:@selector(threadTest1) toTarget:self withObject:nil];
    //成员方法
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadTest1) object:nil];
    //启动线程
    [thread start];
- (void)threadTest1
{
    @autoreleasepool {
        
        NSLog(@"执行后:%@", [NSThread currentThread]);
    }

}

 

三、 NSOperation,面向对象的多线程技术

 

 1> 使用步骤:

    1 实例化操作

        a) NSInvocationOperation

        b) NSBlockOperation

    2 将操作添加到队列NSOperationQueue即可启动多线程执行

 

 2> 更新UI使用主线程队列

    [NSOpeationQueue mainQueue] addOperation ^{};

 

 3> 操作队列的setMaxConcurrentOperationCount

    可以设置同时并发的线程数量!

 

    提示:此功能仅有NSOperation有!

 

 4> 使用addDependency可以设置任务的执行先后顺序,同时可以跨操作队列指定依赖关系

 

    提示:在指定依赖关系时,注意不要循环依赖,否则不工作。

代码实例:

<pre name="code" class="objc">NSOperationQueue *mainQueue = [[NSOperationQueue alloc] init]; 
	通过使用 NSOperationQueue 可以实现线程的顺序运行,代码如下:
	
//设置最大线程数量
[mainQueue setMaxConcurrentOperationCount:10];
//下载
        NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"正在下载 %@", [NSThread currentThread]);
        }];
        //滤镜
        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"滤镜 %@", [NSThread currentThread]);
        }];
        //显示
        NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"更新UI %@", [NSThread currentThread]);
        }];
        //添加操作之间的依赖关系,即一个执行完以后,另一个才能执行
        //依赖关系可以跨线程队列
        [op2 addDependency:op1];
        [op3 addDependency:op2];
        
        
        [mainQueue addOperation:op1];
        [mainQueue addOperation:op2];
        [[NSOperationQueue mainQueue] addOperation:op3];


 
//下载
        NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"正在下载 %@", [NSThread currentThread]);
        }];
        //滤镜
        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"滤镜 %@", [NSThread currentThread]);
        }];
        //显示
        NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"更新UI %@", [NSThread currentThread]);
        }];
        //添加操作之间的依赖关系,即一个执行完以后,另一个才能执行
        //依赖关系可以跨线程队列
        [op2 addDependency:op1];
        [op3 addDependency:op2];
        
        
        [_mainQueue addOperation:op1];
        [_mainQueue addOperation:op2];
        [[NSOperationQueue mainQueue] addOperation:op3];


 



   四、GCDC语言

 GCD就是为了在多核上使用多线程技术

 

 1> 要使用GCD,所有的方法都是dispatch开头的

 2> 名词解释

 global  全局

 queue   队列

 async   异步

 sync    同步

 

 3> 要执行异步的任务,就在全局队列中执行即可

 dispatch_async 异步执行控制不住先后顺序

 

 4> 关于GCD的队列

 全局队列    dispatch_get_global_queue

 参数:优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT

 始终是 0

 串行队列

 主队列

 

 5> 异步和同步于方法名无关,与运行所在的队列有关!

 

 6> dispatch_sync(queue, ^{

         NSLog(@"a -> %@", [NSThread currentThread]);

         });

        无论是什么队列都是在主线程中运行

 同步主要用来控制方法的被调用的顺序


并行代码如下:

//1.队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.将任务异步执行 无法控制先后顺序
    dispatch_async(queue, ^{
        NSLog(@"a -> %@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"b - > %@", [NSThread currentThread]);
    });
    
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"main -> %@", [NSThread currentThread]);
    });

串行代码如下:
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(queue, ^{
        NSLog(@"a -> %@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"b - > %@", [NSThread currentThread]);
    });



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值