文档章节

iOS 多线程GCD的简单使用

JoshSone
 JoshSone
发布于 2016/11/13 00:02
字数 883
阅读 48
收藏 0
点赞 0
评论 0

①什么是线程?什么是进程?

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

引用网上一个很形象的例子,一个软件就像一个工厂,工厂里有分管各项职能的车间(进程),但是由于资源等因素限制,同时每次只能有一个车间(进程)工作,但是一个车间里有许多工人(线程),可以由他们中的一个人或由多个人组成一个团队,由这个团队里的人来共同完成一项生产任务,在一个团队(A)进行一项生产任务时,其他团队(B)是无法参与该项生产任务的(此处的内存被A占用)。

②什么是多核?

即多内核(multicore chips)是指在一枚处理器(chip)中集成两个或多个完整的计算引擎(内核)。

再引用网上一个很形象的例子,比如说搬砖,给你100只手,你把这100只手全部装到一个人的身上,那么这就是多核,多核的好处显而易见,肯定比2只手搬砖快,但是缺点就是受限于人本身(CPU),如果重量太大,人的脊柱就会被压断。

③为什么要使用多线程?

比如执行下面这段代码

 for (int i = 0; i < 100000; i++) {
        NSLog(@"i = %d",i);
    }    
    self.view.backgroundColor = [UIColor greenColor];

我们会发现,要在执行循环语句10万次后,才开始执行设置背景颜色的语句,这就是所谓的主线程卡死。

多线程就是让程序在同一时间,执行多个任务。

④多线程的几种方法

(1)NSThread              

特点:代码量大,很麻烦,线程间通信困难不安全

(2)NSOperation

特点:能控制线程间的通信,但不灵活

(3)GCD

特点:调用灵活,线程间通信简单,支持多核且效率最高

一. GCD的原生使用

 //创建子线程
    dispatch_queue_t t=dispatch_queue_create("XIAOBAIGUAN", NULL);
    //async--异步   sync--同步
    dispatch_async(t, ^{
        for (int i = 0; i< 100000;  i++) {
            NSLog(@"i - %d",i);
        }
    });

 二.GCD

https://pan.baidu.com/s/1hr928y4

#import "GCD.h"
//默认子线程
    [GCDQueue executeInGlobalQueue:^{
        //默认子线程中执行代码
        for (int i = 0; i < 30000; i++) {
            printf("aaa\n");
        }
        //UI部分回到主线程中执行
      [GCDQueue executeInMainQueue:^{
        self.view.backgroundColor = [UIColor greenColor];
      }];
    }];

三.GCDGroup多线程组的使用

//初始化
 GCDGroup *group=[GCDGroup new];
//子线程执行,把当前子线程代码规划到一个组
//[GCDQueue globalQueue] - 获取到globalQueue线程  execute-执行
    [[GCDQueue globalQueue]execute:^{
        NSLog(@"下载资料1");
        NSLog(@"资料1结束");
    } inGroup:group];
    [[GCDQueue globalQueue]execute:^{
        NSLog(@"下载资料2");
        NSLog(@"资料2结束");
        
    } inGroup:group];
//当Group里面所有成员都执行完,会进入到这个notify方法中
    [[GCDQueue mainQueue]notify:^{
        NSLog(@"开始游戏");
    } inGroup:group];
      
注意:子线程不是顺序执行

四.GCDTimer的使用方法

@property(nonatomic,strong)GCDTimer *timer;
//timeInterval- 时间间隔
//delay       - 首次执行前的延迟
//NSEC_PER_SEC- 一秒
self.timer=[[GCDTimer alloc]initInQueue:[GCDQueue mainQueue]];
////计时器执行的代码
    [self.timer event:^{
        NSLog(@"嘀哒嘀");
    } timeInterval:NSEC_PER_SEC * 3 delay:NSEC_PER_SEC*3];
//开始
 [self.timer start];
//结束后销毁
 [self.timer destroy];

五.GCDSemaphore信息源的使用方法

[GCDQueue executeInGlobalQueue:^{      
        NSLog(@"执行1");      
        //等待命令
        [semaphore wait];    
        NSLog(@"执行3");      
    }];
    
    [GCDQueue executeInGlobalQueue:^{      
      NSLog(@"执行2");
        sleep(5);     
        //发出信号
        [semaphore signal];
        
    }];

这两段代码的执行顺序如下:

© 著作权归作者所有

共有 人打赏支持
JoshSone
粉丝 7
博文 62
码字总数 32794
作品 0
长春
iOS工程师
如何判断你是合格的高级iOS开发工程师?

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

_小迷糊 ⋅ 05/26 ⋅ 0

面试攻略:何为技术和年龄不匹配

最近帮人组建研发中心,面试了很多开发工程师,对“技术能力与工作年限是否匹配”的理解更深了,记录下来分享给大家。 为便于讨论,简单的依据工作年限,划分出 3 个阶段: 1 ~ 3 年 4 ~ 5 ...

imbrl71u7pt5x29rleu7 ⋅ 04/18 ⋅ 0

面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课 ⋅ 04/26 ⋅ 0

iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码

iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件(http://www.code4app.com/thread-14507-1-1.html) iOS高仿微信完整项目源码(http://www.code4app.com/thread-14695-1-1.html)......

sunnyaigd ⋅ 06/12 ⋅ 0

iOS自定义弹出视图、收音机APP、图片涂鸦、加载刷新、文件缓存等源码

iOS精选源码 一款优秀的 聆听夜空FM 源码(http://www.code4app.com/thread-14546-1-1.html) zhPopupController 简单快捷弹出自定义视图(http://www.code4app.com/thread-14861-1-1.html) WHS......

sunnyaigd ⋅ 06/04 ⋅ 0

经过阿里,百度一面,二面后,我总结了50道iOS面试题

前言: 金三银四已经过去,根据统计,很多人都会选择在三月四月跳槽,原因有很多,企业年后会有大量员工离职,员工觉得老公司待遇不怎么样?薪资不够高,想换个新环境等等原因,所以,三月四...

原来是泽镜啊 ⋅ 05/04 ⋅ 0

iOS渐变字体、动态条纹、获取特定位置cell、笔记App、购物车界面等源码

iOS精选源码 RAC实现添加购物车(http://www.code4app.com/thread-29956-1-1.html) 一个基于Photos.framework的图片多选,持续功能的更新中(http://www.code4app.com/thread-29959-1-1.html)...

sunnyaigd ⋅ 05/29 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

iOS多线程:『NSOperation、NSOperationQueue』详尽总结

iOS多线程:『NSOperation、NSOperationQueue』详尽总结 转载: 原地址https://www.jianshu.com/p/4b1d77054b35 本文首发于我的个人博客:『不羁阁』 文章链接:传送门 本文更新时间:2018年0...

法斗斗 ⋅ 04/20 ⋅ 0

iOS基础深入补完计划--NSURLSession使用详解(附Demo)

目录 前言 API Demo 前言 本文主要是把NSURLSession以及NSURLSessionTask相关的代理方法全部整理了一下。 旨在大体了解在一个iOS网络请求中、一个任务究竟经理了什么。 而我们、又能做些什么...

kirito_song ⋅ 05/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 8分钟前 ⋅ 0

如何使用serverchan微信推送告警

之前实现推送告警信息到微信的方法有如下几种: 1、通过企业公众号实现----收费: 2、通过QQ邮箱,在微信平台上开启收到邮件进行提醒; 3、第三方告警平台API,一般也是收费的; 不过最近看文...

问题终结者 ⋅ 34分钟前 ⋅ 0

TCP的RPC

RPC就是远程方法调用(Remote Process Call ),包含了客户端和服务端,涉及了对象的序列化传输。 1.服务端启动,注册远程调用的类2.客户端发送请求信息包含类、方法、参数的一些信息、序列化传...

Cobbage ⋅ 55分钟前 ⋅ 0

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 今天 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 今天 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 今天 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 今天 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部