ios开发关于多线程编程的理解(二)

来源:互联网 发布:c 定义结构体数组 编辑:程序博客网 时间:2024/06/13 08:30

Dispatch

异步执行技术。

何为线程?1个cup执行的cup命令列为一条无分叉路径。


何为多线程?1个cup核执行多条不同路径上的不同命令。


何为多线程编程?程序可以在某个线程和其他线程之间反复多次进行上下文切换。

会出现的问题?

死锁:多个线程相互等待

数据竞争:多个线程同时更新相同资源导致数据不一致。

消耗大量内存等。


多线程编程的优点:


GCD的使用:

开发者要做的只是定义想执行的任务并追加到适当的dispatch queue中。

 

两种队列类型:serial(串行)和concurrent(并行)

创建:

    dispatch_queue_t serial_queue =dispatch_queue_create("serial_queue", NULL);

dispatch_queue_tconcurrent_queue =dispatch_queue_create("concurrent_queue", DISPATCH_QUEUE_CONCURRENT);

 

第一个参数:线程名称

第二个参数:线程类型

区别:

 



生成的queue必须由程序员亲自释放。(对于最低sdk版本>=ios6.0来说,GCD对象已经纳入了ARC的管理范围,我们就不需要再手工调用dispatch_release了)

dispatch_release(serial_queue);

dispatch_retain(concurrent_queue);(类似于引用计数)

 

获取系统提供的dispatch queue:


 

#define DISPATCH_QUEUE_PRIORITY_HIGH 2

#define DISPATCH_QUEUE_PRIORITY_DEFAULT0

#define DISPATCH_QUEUE_PRIORITY_LOW (-2)

#define DISPATCH_QUEUE_PRIORITY_BACKGROUNDINT16_MIN

 

dispatch_queue_t main_queue= dispatch_get_main_queue();

dispatch_queue_t global_queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

 

变更队列的优先级方法:

dispatch_set_target_queue(serial_queue,global_queue);

第一个参数:要执行变更优先级的队列

第二个参数:要执行的优先级的队列

 

在指定时间之后执行的方法:

NSLog(@"start");

dispatch_time_t time =dispatch_time(DISPATCH_TIME_NOW, 3*NSEC_PER_SEC);

dispatch_after(time, dispatch_get_main_queue(), ^{

       NSLog(@"3秒后执行");

});

 

dispatch group的作用:

在追加到dispatch queue后中的多个处理结束后想要进行的操作。(在使用多个并行进程之后)。具体例子如下:

dispatch_group_t group = dispatch_group_create();

   

   dispatch_async(global_queue, ^{NSLog(@"1");});

    dispatch_async(global_queue,^{NSLog(@"2");});

   dispatch_async(global_queue, ^{NSLog(@"3");});

   dispatch_async(global_queue, ^{NSLog(@"4");});

   

dispatch_group_notify(group, global_queue, ^{

       NSLog(@"end");

    });

 

dispatch_barrier_async函数的用法:


简要的含义如图所示。

 

Dispatch_once用法:

保证程序在执行过程中只执行一次。

static dispatch_once_t onceToken;

   dispatch_once(&onceToken, ^{

//       code to be executed once

});

 

 

dispatch source


以下举个例子,与定时器事件相关。

__block NSInteger time = 59; //倒计时时间

   

    dispatch_queue_tqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

   dispatch_source_t _timer =dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

   

   dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC,0); //每秒执行

   

   dispatch_source_set_event_handler(_timer, ^{

       

       if(time <= 0){ //倒计时结束,关闭

           

           dispatch_source_cancel(_timer);

           dispatch_async(dispatch_get_main_queue(), ^{

               

               //设置按钮的样式

               [self.smsBtn setTitle:@"重新发送" forState:UIControlStateNormal];

               [self.smsBtn setEnabled:YES];

           });

           

       }else{

           

           int seconds = time % 60;

            dispatch_async(dispatch_get_main_queue(),^{

               

               //设置按钮显示读秒效果

               [self.smsBtn setTitle:[NSString stringWithFormat:@"重新发送(%.2d)", seconds]forState:UIControlStateNormal];

               [self.smsBtn setEnabled:NO];

           });

           time--;

        }

    });

dispatch_resume(_timer);

该功能实现的是定时60秒,倒计时显示,计数到结束后显示“重新发送”,类似于发送验证码的功能。

 

以上内容是由笔者根据书上的内容总结出来的,引用时请标明转载来源。

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝胆汁酸高22怎么办 5个月发烧38度怎么办 28个月宝宝不愿把尿怎么办 16个月宝宝咳嗽怎么办 宝宝晚上不用纸尿裤要尿床怎么办 宝宝头型睡偏了怎么办 初生婴儿鼻子被奶块堵住怎么办 月经排的不顺畅怎么办 四个月的小孩拉肚子怎么办 月经期做了水光怎么办 4个多月的宝宝拉肚子怎么办 2个月婴儿积食怎么办 3个月婴儿积食怎么办 2个月的婴儿干呕怎么办 脚上的皮烂了怎么办 嘴皮里面烂了怎么办 未满月婴儿拉屎很费劲怎么办 新生儿血钙1.7怎么办啊 3个月宝宝胃口小怎么办 3个月宝宝缺钙怎么办 五个月宝宝吃手睡觉怎么办 2个月宝宝有蛲虫怎么办 四个月婴儿漏屎怎么办 母乳喂养6个月才11斤怎么办 过期的果泥肉泥怎么办? 孩子被开水烫了怎么办 小儿喝开水烫了怎么办 小孩不识字怎么办17-18 3岁宝宝不识数字怎么办 小孩数字写反了怎么办 3岁宝宝乱啃东西怎么办 闹钟的指针松了怎么办 手机想让它横屏怎么办 教孩子写作业头都被气炸了怎么办 2岁宝宝大小脸怎么办 宝宝2岁半不认识颜色怎么办 宝宝11个多月突然排斥妈妈怎么办 5个月婴儿粘妈妈怎么办 3岁宝宝记不住颜色怎么办 3岁宝宝不认字怎么办 墙纸被宝宝弄上各种颜色怎么办