子线程同步与异步:

dispatch_sync(),同步添加操作。他是等待添加进队列里面的操作完成之后再继续执行。

dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_sync(concurrentQueue, ^(){
        NSLog(@"2");
        [NSThread sleepForTimeInterval:10];
        NSLog(@"3");
    });
    NSLog(@"4");
输出 :
       
11:36:25.313 GCDSeTest[544:303] 1

11:36:25.313 GCDSeTest[544:303] 2

11:36:30.313 GCDSeTest[544:303] 3//模拟长时间操作

11:36:30.314 GCDSeTest[544:303] 4

dispatch_async ,异步添加进任务队列,它不会做任何等待

dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(concurrentQueue, ^(){
        NSLog(@"2");
        [NSThread sleepForTimeInterval:5];
        NSLog(@"3");
    });
    NSLog(@"4");
输出:
 11:42:43.820 GCDSeTest[568:303] 1

11:42:43.820 GCDSeTest[568:303] 4

11:42:43.820 GCDSeTest[568:1003] 2

11:42:48.821 GCDSeTest[568:1003] 3//模拟长时间操作时间

子线程操作UI:

方法1:performSelectorOnMainThread

[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO];

方法2:dispatch_async(dispatch_get_main_queue(), ^{ ... })

  1. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  2. // 处理耗时操作的代码块...
  3. //通知主线程刷新
  4. dispatch_async(dispatch_get_main_queue(), ^{
  5. //回调或者说是通知主线程刷新,
  6. });
  7. });

dispatch_async开启一个异步操作,第一个参数是指定一个gcd队列,第二个参数是分配一个处理事物的程序块到该队列。

dispatch_get_global_queue(0, 0),指用了全局队列。

一般来说系统本身会有3个队列。global_queue,current_queue,以及main_queue.

获取一个全局队列是接受两个参数,第一个是我分配的事物处理程序块队列优先级。分高低和默认,0为默认2为高,-2为低

[cpp] view plaincopy
  1. #define DISPATCH_QUEUE_PRIORITY_HIGH     2
  2. #define DISPATCH_QUEUE_PRIORITY_DEFAULT  0
  3. #define DISPATCH_QUEUE_PRIORITY_LOW     (-2)

处理完事物后,需要将结果返回给或者是刷新UI主线程,同样,和上面一样,抓取主线程,程序块操作。

iOS子线程操作总结相关推荐

  1. Ios子线程渲染Opengl

    1. 介绍 ios并没有像Android glsurfaceview或者Qt QOpenglWidget 那样完整Opengl渲染View封装,官方demo也是主线程创建的CADisplayLink提 ...

  2. [异步、tensorflow] - 子线程操作tensor,主线程处理tensor

    参考 整体流程如下图 代码 import tensorflow as tf"""模拟: 子线程不停的取数据放入队列中, 主线程从队列中取数据执行包含: 作用域的命名.把程 ...

  3. 解决子线程操作UI的方法

    转载于:https://www.cnblogs.com/ouyangping/p/7414289.html

  4. C#中子线程操作主线程中窗体上控件的方法

    Demo this.listView1.Visible = true;this.listView1.BeginUpdate();this.listView1.EndUpdate(); //结束数据处理 ...

  5. DLL内线程同步主线程研究(子线程代码放到主线程执行)

    DLL内线程同步主线程研究(子线程代码放到主线程执行) 我们在实际项目中经常会用到多线程编程,比如Socket编程等,在创建的线程内同步主线程一般使用Synchronize方法实现子线程操作放到主线程 ...

  6. 为什么子线程中不能直接更新UI

    点击上方"dotNET全栈开发","设为星标" 加"星标★",每天11.50,好文必达 全文约4000字,预计阅读时间8分钟 当初有同事就碰 ...

  7. android 关于关于子线程更新UI的一些事

    我们在看一些书或者博客时总是会看到一句话"android更新UI操作都是在Main主线程中,子线程中不能进行UI更新操作"那么,在子线程中真的不能进行UI的更新操作吗? //源码环 ...

  8. Android为什么不能在子线程更新UI

    Android为什么不能在子线程更新UI Android为什么不能在子线程更新UI? 如果不做这个校验,是不是我也可以正常在子线程更新UI 但是google为什么要这样去设计呢 ViewRootImp ...

  9. 面试官问我:Andriod为什么不能在子线程更新UI?

    记得看文章三部曲,点赞,评论,转发. 微信搜索[程序员小安]关注还在移动开发领域苟活的大龄程序员,"面试系列"文章将在公众号同步发布. 1.前言 看完<你为什么在现在的公司不 ...

最新文章

  1. mysql乐观锁总结和实践
  2. 中科大计算机专业跟浙江大学计算机专业相比,浙大计算机研究生近年录报比与中国科学技术大学的比较...
  3. 对HA的简单认识以及HA集群删除
  4. 42.虚拟内存如何设置:
  5. Ubuntu 11.10 Server下搭建Maven私服
  6. python 天气预报 mysql_Python+PyQt5+MySQL实现天气管理系统
  7. win10命令提示符怎么打开_Win10系统防火墙怎么打开?ARP防火墙启用步骤
  8. RiPro子主题V8.0 – V8.1,开心版
  9. Swagger中paramType
  10. Linux运维故障排查——SSH连接Fedora不成功的原因
  11. 增长量计算n+1原则_事业单位行测:巧解增长量计算公式
  12. 【Proteus】超声波测距
  13. 离散时间傅里叶变换(DTFT)
  14. duplicate from active dg 的 run 脚本 sfile 为完整配置可能导致的一些错误
  15. 处理安卓机不支持backdrop-filter毛玻璃效果样式
  16. 后缀是lnk是什么文件_ink是什么文件
  17. 手游直播到底难在哪里?
  18. 永远不要忘记_它永远不会忘记一张脸
  19. Assignment | 05-week3 -Part_2-Trigger Word Detection
  20. 虚拟机报错模块“Disk”启动失败。 未能启动虚拟机。

热门文章

  1. 计算机硬件与游戏发展史,电脑硬件的发展历程中 什么是电竞SSD?
  2. 测评结果_刚刚,2018全国文明城市测评结果重磅公布!你的家乡排第几?
  3. matlab相关的数字信号,数字信号处理及其MATLAB实现.ppt
  4. 和与余数的和同余理解_每日一题 | 第38期:数量关系之余数特性
  5. linux里打包和压缩文件,linux ---打包和压缩文件
  6. RocketMQ 消息丢失场景及解决办法
  7. 解决原子性问题?你首先需要的是宏观理解
  8. java poi设置单元格格式为数值,Apache POI 如何读取Excel中数值类型单元格所规定的保留小数位?...
  9. 散列表的设计与实现_python基础之字典与集合实现
  10. html src 图片不显示图片,css中不用src也让图片显示的方法是什么?