玩转iOS开发:iOS中的GCD开发(三)
上一章, 我们了解到了GCD里的一些队列和任务的知识, 也实践了一下, 同时我们也对主队列的一些小情况了解了一下, 比如上一章讲到的卡线程的问题, 如果没有看的朋友可以去看看玩转iOS开发:iOS中的GCD开发(二)回顾一下.
这一章, 我们来讲讲关于GCD的一些其他小知识.
转载声明:如需要转载该文章, 请联系作者, 并且注明出处, 以及不能擅自修改本文.
GCD之间的通信
在我们日常的iOS开发里, 我们一般是会在主线程里刷新UI, 比如: 处理按钮的点击事件, 滚动视图, 拖拽视图等等操作.
但其他比较耗时的, 我们都会放在其他线程里进行操作, 比如: 上传/下载图片, 上传/下载文件等比较耗时的操作.
但这里还需要配合一下主线程来进行操作一番, 比如我们下载完图片之后, 需要回到主线程中刷新UI, 这时候我们就需要用到GCD之间的通信啦.
不懂? 那我们就来看看代码呗, 这里为了和上一章的工程重复, 我就新建过另一个工程, 取名为GCD-Up-Example, 机智如我~
1 |
- (void)gcdCommunication {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (NSInteger i = 0; i < 5; i++) {
NSLog(@"第%ld次任务的主线程为: %@", i, [NSThread currentThread]);
|
1 |
2017-08-05 18:47:11.942 GCD-Up-Example[15176:7745714] 第0次任务的主线程为: <NSThread: 0x60000006bb80>{number = 3, name = (null)}
|
从结果里, 我们可以看到, 所有任务执行完之后, 就会回到主线程里了.
GCD的栅栏方法
有这么一个场景, 当我们需要进行异步操作两组数据时, 要求执行完第一组之后, 才能执行第二组, 那这个咋办咧?
在GCD当中, 有一个方法可以解决这种需求, 也就是所谓的栅栏方法也称为屏障, 现在我们来撸一下:
1 |
- (void)gcdBarrier {
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"第一次任务的主线程为: %@", [NSThread currentThread]);
|
1 |
2017-08-05 19:00:44.494 GCD-Up-Example[15252:7757142] 第一次任务的主线程为: <NSThread: 0x60000007d580>{number = 3, name = (null)}
|
1 |
- (void)gcdAfter {
NSLog(@"我是一个路人");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"2秒后执行了.");
|
1 |
2017-08-05 19:07:20.039 GCD-Up-Example[15340:7766123] 我是一个路人 |
- 看到结果, 我们就知道, 的确是延迟了两秒后才执行.
- 如果你们不知道在哪里设置时间的话, 看这句代码里的2.0, 这就是设置时间了.
GCD只执行一次的方法
有时候, 我们需要创建一个类, 而这个类的某个方法只可以执行一次, 比如创建一个单例, 怎么用GCD解决呢?
既然能够提到这个问题, 那GCD肯定也会提供对方的方法嘛, 是吧~
1 |
- (void)gcdOne {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
|
GCD的快速遍历方法
在GCD当中, 也有一个类似for的遍历方法, 和for不同, 它几乎是同时遍历的.
1 |
- (void)gcdApply {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(5, queue, ^(size_t index) {
NSLog(@"执行第%ld任务, 当前线程为: %@", index, [NSThread currentThread]);
|
1 |
2017-08-05 20:36:08.389 GCD-Up-Example[15555:7794146] 执行第0任务, 当前线程为: <NSThread: 0x608000074840>{number = 1, name = main}
|
从结果里我们可以看到, 它几乎是同时遍历的, 而且要注意, 这个方法是开启了新线程来进行遍历的.
GCD的Queue Group
在某个场景下, 我们需要同时异步执行两个耗时的任务, 并且在执行完成后直接回到主线程, 这个怎么做呢?
在GCD中, 有一个叫做队列组的东西(Queue Group), 它就可以满足我们这个场景需求了.
1 |
- (void)gcdQueueGroup {
dispatch_group_t group = dispatch_group_create();
|
总结
GCD的一些常用知识基本到这里, 基本上已经哦了, 如果你还要更深入的去了解的话, 可以去GCD官方文档里查找一下你所需要的资料.
再多说一句话, 学习理论知识固然重要, 但要和实际开发使用挂钩, 不然光学不用, 等于空.
工程地址
项目地址: https://github.com/cainluo/iOS-Project-Example/tree/master/GCD-Up-Example
玩转iOS开发:iOS中的GCD开发(三)的更多相关文章
- iOS开发之多线程技术——GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
- iOS开发:深入理解GCD 第一篇
最近把其他书籍都放下了,主要是在研究GCD.如果是为了工作,以我以前所学的GCD.NSOperation等知识已经足够用了,但学习并不仅仅知识满足于用它,要知其然.并且知其所以然,这样才可以不断的提高 ...
- iOS开发-多线程之GCD(Grand Central Dispatch)
Grand Central Dispatch(GCD)是一个强有力的方式取执行多线程任务,不管你在回调的时候是异步或者同步的,可以优化应用程序支持多核心处理器和其他的对称多处理系统的系统.开发使用的过 ...
- iOS开发之多线程技术—GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
- iOS开发多线程篇 05 —GCD介绍
iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...
- iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
- Swift开发iOS应用过程中的问题和解决记录
虚拟机里安装OSX+XCode开发环境 用真机的请直接跳过这个部分. 主要是在VitrualBox里安装mac系统和xcode,参考这篇教程,VirtualBox的版本是4.3.18 r96156,O ...
- iOS 自定义控件开发(中)
<iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> 接上篇iOS自定义控件开发之后,我们尝试另外一种. 在Xcode的右边,会看到如下的图 其中,上面有一个:C ...
- 在Visual Studio中使用MonoTouch开发iOS应用程序
前段时间在工作机上装了Mac OS X,这主要是因为我最近需要开发iPhone应用程序.虽然Xcode,Objective C一定是开发iOS应用程序的主流,但是经过一番考虑,我还是决定尝试一下使用M ...
随机推荐
- Django_HTML
一.web开发之HTML 1.1 HTML相关基础 快速生成html的模版方法: 在visual code的新建html文件中输入:!然后tab回车就会出现HTML的模版 双标签: <p> ...
- typescript-学习使用ts-2
解构赋值 数组解构 let input = [1, 2]; let [first, second] = input; console.log(first); // outputs 1 console. ...
- iOS开发-消息初认识
一.消息循环(runLoop)的作用 1,防止程序退出, 2,接受事件 3,如果没有事件,让程序自动休眠 二.消息源 1, 输入源:键盘.鼠标.NSBoard.NSPort 2,定时源 ...
- 迅为iTOP-开发板-驱动-can和rfid配置
在迅为开发板中,在 4412,4418 以及 6818 中,有的开发板默认配置 RFID,有的默认配 置 CAN 驱动(IMX6 默认都配置). 本文档介绍如何配置 CAN 和 RFID 的驱动. 截 ...
- [原]win10开机时开启NumLock
修改如下注册表项下的InitialKeyboardIndicators的值为80000002,重启即可. HKEY_USERS\.Default\Control Panel\Keyboard\ HKE ...
- Django静态文件配置-request方法-ORM简介-字段的增删改查
app的创建注意事项: 在Django新创建的app要在seetings.py中添加注册,才会生效 创建app:django-adminapp an startapp app名称 或者 python3 ...
- XMemcached 中文api
变更历史 2010-06-22 添加客户端分布和SASL验证两节,更新spring配置一节. 2010-06-23 添加maven依赖说明 2010-10-17 1.2.6 released 2011 ...
- spring自带的定时任务功能,基于注解和xml配置
1.spring的配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&quo ...
- 迅为iTOP-4418开发板编译Ubuntu
Ubuntu 系统比较特殊,源码就是它的镜像.Ubuntu 系统通过解压的方式进行烧写,我们也可以通过配置解压出来的 Ubuntu 系统源码文件夹,来配置 Ubuntu 系统.然后通过打包压缩的方式来 ...
- SGD/BGD/MBGD使用python简单实现
算法具体可以参照其他的博客: 随机梯度下降: # coding=utf-8 ''' 随机梯度下降 ''' import numpy as np # 构造训练数据 x = np.arange(0., 1 ...