文档章节

iOS多线程编程之基础

 石头2017
发布于 2015/10/19 20:14
字数 954
阅读 61
收藏 3

多线程是为了解决主线程被阻塞,并提高效率的一种方式.

首先我们要学习多线程编程就要看看它有哪几种方式:

  1. NSThread

  2. NSOperation

  3. Grand Centeral Dispatch

我们看看NSThread的创建方式::

    

NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(btnSum:) object:nil];
    //通过iniit 创建NSThread 需要手动开启线程
    [thread start];
    [thread cancel];
    //第二种开启并自动执行 btnSum 是自己写的一个方法
    [NSThread detachNewThreadSelector:@selector(btnSum:) toTarget:self withObject:nil];
- (void)btnSum:(UIButton *)sender {
    
    long sum = 0;
    
    for (long i = 0; i < 10; i ++) {
        sum += i;
        NSLog(@"number %ld current Thred : %@  %@",sum,[NSThread currentThread],[NSOperationQueue currentQueue]);
        
    }
    
}

 使用NSThread 或直接从 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程。如果你选择thread来实现多线程,那么 NSThread 就是官方推荐优先选用的方式


NSOperation

/**
     NSOperationQueue线程队列
*/
//    1.NSInvocationOperation操作

    NSInvocationOperation *iOP =[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(btnSum:) object:nil];
    
    //Operation是不能执行的,需要队列进行调用
    [[NSOperationQueue mainQueue] addOperation:iOP];
    
    //2.NSBlockOperation
    
    NSBlockOperation *bOP = [[NSBlockOperation alloc]init];
   //以代码块的方式添加操作
    [bOP addExecutionBlock:^{
        [self btnSum:nil];
    }];
    
    //添加到线程队列
    [self.operationQueue addOperation:bOP];

为了创建一个简单的NSOperation对象,直接重写了getter方法

- (NSOperationQueue *)operationQueue{
    if (!_operationQueue ) {
        _operationQueue = [[NSOperationQueue alloc]init];
        [_operationQueue setName:@"queue"];
    }
    return _operationQueue;
}
//NSBlockOperation 创建方式,可以用便利构造器,直接添加block
    NSBlockOperation *bOP = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 100; i ++) {
            NSLog(@"%d,当前线程:::%@",i,[NSThread currentThread]);
        }
    }];
    NSBlockOperation *aOP = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 100; i ++) {
            NSLog(@"%d,当前线程:::%@",i,[NSThread currentThread]);
        }
    }];
    NSBlockOperation *cOP = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 100; i ++) {
            NSLog(@"%d,当前线程333333333:::%@",i,[NSThread currentThread]);
        }
    }];
    //添加到主队列
    [[NSOperationQueue mainQueue] addOperation:bOP];
    [[NSOperationQueue mainQueue] addOperation:cOP];
//自定义队列
    self.operation = [[NSOperationQueue alloc]init];
    //设置最大并发数
    self.operation.maxConcurrentOperationCount = 1;//在同一连续时刻只执行一个操作
//    self.operation.maxConcurrentOperationCount = 4;
    
   [self performSelectorInBackground:@selector(printNumber:) withObject:@"NSObject"];
  
    [self.operation addOperation:aOP];
    [self.operation addOperation:cOP];

GCD

/**
GCD 中央派发机制 Grand Central Dispatch
 基于函数,使用分发队列FIFO
*/
    //1.主线程队列::等同于[NSOperationQueue mainQueue]
    //2.全局线程队列 后台队列  并行
    //3.自定义线程队列 DISPATCH_QUEUE_SERIAL 串行
//                   DISPATCH_QUEUE_CONCURRENT 并行
    /*
    //创建自定义队列,默认为串行(故加了个优先级的东东::DISPATCH_QUEUE_PRIORITY_DEFAULT)
    dispatch_queue_t myQueue = dispatch_queue_create("com.liulei.www.myQueue",DISPATCH_QUEUE_PRIORITY_DEFAULT);
    
//串行队列

    // dispatch_async(队列, 执行block) 异步
    // dispatch_sync(队列, 执行block)同步
    dispatch_async(myQueue, ^{
        [self printNumber:@"GCD"];
        [self printNumber:@"GCD1"];
    });
    
    
    dispatch_async(myQueue, ^{
        [self printNumber:@"GCD2"];
    });
    */
    /*
//并行队列
    dispatch_queue_t conQueue = dispatch_queue_create("conQueue", DISPATCH_QUEUE_CONCURRENT);
    
    //一个bolck中串行
    dispatch_async(conQueue, ^{
        //顺序执行
        [self printNumber:@"G1"];
        [self printNumber:@"G2"];
        [self printNumber:@"G3"];
    });
    //并行执行
    dispatch_async(conQueue, ^{
        
        [self printNumber:@"G4"];
    });
    
    dispatch_async(conQueue, ^{
        [self printNumber:@"G5"];
    });
    */
    //dispatch_after ..//延时操作

既然说道多线程的开发,难免会在多线程之间进行通讯;
利用NSObject的一些类方法,可以轻松搞定。(NSObject内置方法来创建线程)

在应用程序主线程中做事情:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array

在指定线程中做事情:
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array
在当前线程中做事情:
//Invokes a method of the receiver on the current thread using the default mode after a delay.
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

performSelector:withObject:afterDelay:inModes:

取消发送给当前线程的某个消息
cancelPreviousPerformRequestsWithTarget:

cancelPreviousPerformRequestsWithTarget:selector:object:

如在我们在某个线程中下载数据,下载完成之后要通知主线程中更新界面等等,可以使用如下接口:- 
[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
比如下载完成后,通知主线程(ui线程),以便app再做其他工作


© 著作权归作者所有

共有 人打赏支持
下一篇: iOS 自动归档
粉丝 0
博文 7
码字总数 2240
作品 0
德州
私信 提问
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
2018/05/26
0
0
[吐]滔哥帮单位招聘啦!!!

@叶秀兰 让我移个贴,,,,但这真的不是招聘了....大家懂了吗? iOS平台开发经验,能够独立完成开发,解决验证和修正测试中发现的问题, 对iPhone/iPad/Mac应用开发流程比较熟悉, 精通C、...

滔哥
2014/10/30
1K
21
iOS开发的你,现在准备脱坑还是继续进阶呢?

序言 我相信很多人都在说,iOS行业不好了,iOS现在行情越来越难了,失业的人比找工作的人还要多。失业即相当于转行,跳槽即相当于降低自己的身价。那么做iOS开发的你,你是否在时刻准备着跳槽...

_小迷糊
2018/10/31
0
0
IOS学习,最简单的表格应用程序,学习,列出博客

IOS编程浅蓝教程,这是博客地址http://www.cnblogs.com/haichao/category/425378.html IOS编程浅蓝教程:锲子 IOS编程浅蓝教程(一)先决条件:开始iOS编程的必要准备 IOS编程浅蓝教程(二) Hel...

andy521zhu
2015/01/17
0
0
【书坊赠书福利——第二期】《iOS 8开发指南》

本周是人邮IT书坊赠书的第二期,第一期参与度极高,微信君在此感谢你们的支持,第一期获奖赠书已全部寄出。 本周赠品 本周,微信君给大家推荐@人民邮电出版社-信息技术分社 刚刚上架的新书《...

生气的散人
2014/09/23
371
0

没有更多内容

加载失败,请刷新页面

加载更多

独家解密:阿里超大规模数据中心性能分析

郭健美,阿里巴巴高级技术专家,目前主要从事数据中心的性能分析和软硬件结合的性能优化。CCF 系统软件专委和软件工程专委的委员。曾主持国家自然科学基金面上项目、入选上海市浦江人才计划A...

阿里云云栖社区
33分钟前
3
0
独家解密:阿里大规模数据中心性能分析

郭健美,阿里巴巴高级技术专家,目前主要从事数据中心的性能分析和软硬件结合的性能优化。CCF 系统软件专委和软件工程专委的委员。曾主持国家自然科学基金面上项目、入选上海市浦江人才计划A...

zhaowei121
36分钟前
1
0
mongodb系列~配置文件的优化与处理

mongodb系列~配置文件的优化与处理 一 简介:讲讲如何优化mongo配置文件 二 常规参数 port= //端口 fork=true//守护进程方式启动mongo logpath=shard.log //mongo日志存放路径 journal= tru...

linjin200
38分钟前
1
0
同一台 windows10 设备,安装两个不同版本的mysql

两个mysql 的my.ini文件需要 配置不同的端口。 [mysqld]# 设置3307端口port=3307# 设置mysql的安装目录basedir=F:\\mysql-5.7.24-winx64 # 切记此处一定要用双斜杠\\,单斜杠我这里...

无敌小学僧
38分钟前
3
0
条码插件TBarCode Office系列教程一(Word Add-In篇)

TBarCode Office是一款适用于Microsoft Word 2007、2010和2013的条码插件,通过此插件可以轻松的在您的文档中嵌入代码。此系列教程旨在介绍TBarCode Office的常见问题及解答,帮助大家学习使...

ymy_666666
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部