实际项目开发中为了能够给用户更好的体验,有些延时操作我们都会放在子线程中进行。

今天我们就来聊聊多线程在实际项目中的运用。

我们先来看看多线程的基础知识:

1.多线程的原理:

同一时间,CPU只能处理一条线程,也就是只有一条线程在工作。所谓多线程并发(同时)执行,

其实是CPU快速的在多线程之间调度(切换)。如果CPU调度线程的时间足够快,就造成了多线程并

发执行的假象。

2.在实际项目开发中并不是线程越多越好,如果开了大量的线程,会消耗大量的CPU资源,CPU会

被累死,所以一般手机只开1~3个线程为宜,不超过5个。

3.多线程的优缺点:

优点:1.能适当提高程序的执行效率

2.能适当提高资源的利用率,这个利用率表现在(CPU,内存的利用率)

缺点:1.开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,

子线程占用512KB,如果开启大量的线程,会占用大量的内存空间,降低程序

的性能)

2.线程越多,CPU在调度线程上的开销就越大

3.程序设计就越复杂:比如线程之间的通信,多线程的数据共享,这些

都需要程序的处理,增加了程序的复杂度。

4.在iOS开发中使用线程的注意事项:

1.别将比较耗时的操作放在主线程中

2.耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验

好了,多线程在iOS中的开发概念性的东西就讲这么多,下面我们来模拟一种开发中的场景:

我们在开发中经常会遇到,当你要缓存一组图片,但是这些图片必须要等到你缓冲好了后再来展现在UI上,

可是我们缓存图片的时候用的是SDWebImage框架,缓存的操作是异步进行的,我们如何来做到等缓存好了

再来执行以后的操作呢?下面讲个实现起来非常简单,方便的方法:

我先来放上代码,后面进行讲解:

//1.添加一个组
let group = dispatch_group_create() //缓存图片
for url in picURLs! { //2.将当前的下载操作添加到组中
dispatch_group_enter(group)
SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions.init(rawValue: 0), progress: nil, completed: { (_, _, _, _, _) in //3.离开当前组
dispatch_group_leave(group)
print("正在缓存中...")
})
} //通过闭包将数据传递给调用者(通知图片缓存完毕)
dispatch_group_notify(group, dispatch_get_main_queue()) {
print("缓存完毕!")
finished()
}

从输出结果我们就可以看出来:我们做到了缓存完毕后再来执行以后的操作。

是如何做到的呢?

我在代码中已经用数字标出来了:

1.我们首先用

let group = dispatch_group_create()

函数来创建一个组,用来存放缓冲的操作

2.用这个函数做到把每一次的缓冲操作都添加到组中

dispatch_group_enter(group)

3.缓存图片我用的是SDWebImage框架,我们可以看到,我在缓冲完毕后离开当前组,用到如下函数

dispatch_group_leave(group)

用了这三步就能做到我们想要的功能吗?显然不是,做了这三部系统内部就会为我们做些事了,

当我们离开当前组的时候,系统就会发出一个通知,我们来接收这个通知,当我们接收到这个通知的时候

我们就可以执行finished的操作了,接收通知的函数是:

dispatch_group_notify(group, dispatch_get_main_queue()) {
print("缓存完毕!")
finished()
}

以上就是一个非常方便的实现我们需要的功能的方法

https://blog.csdn.net/qq_24904667/article/details/52679473

iOS开发多线程在实际项目中的运用的更多相关文章

  1. iOS开发小技巧--微博项目中的键盘工具条

    微博项目中的键盘工具条 项目中的键盘工具条不能使用inputAccessoryView,因为inputAccessoryView不能实现键盘隐藏的时候,工具条还显示在眼前,如图: 所以,果断决定将工具 ...

  2. 【iOS开发】在ARC项目中使用非ARC文件

    ARC的出现应该说是开发者的一大福利,苹果是推荐使用的,但是因为之前没有ARC机制,好多比较好的类库都是使用的非ARC,或是有些大牛还是不喜欢用ARC,封装的类也是非ARC的,想要在自己的ARC项目中 ...

  3. iOS开发小技巧--初始化项目中修改APP安装后的名称

  4. iOS开发多线程篇—自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  5. iOS开发多线程篇 11 —自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  6. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  7. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  8. iOS开发多线程篇—创建线程

    iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] in ...

  9. iOS开发多线程篇—线程间的通信

    iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任 ...

随机推荐

  1. 数据可视化实例(十一): 矩阵图(matplotlib,pandas)

    矩阵图 https://datawhalechina.github.io/pms50/#/chapter9/chapter9 导入所需要的库 import numpy as np # 导入numpy库 ...

  2. git分支管理的策略和冲突问题

    目录 备注: 知识点 关于分支中的冲突 分支管理的策略 分支策略 备注: 本文参考于廖雪峰老师的博客Git教程.依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文. 知识点 git log ...

  3. Spark实现wordcount的几种方式

    方法一:map + reduceByKey package com.cw.bigdata.spark.wordcount import org.apache.spark.rdd.RDD import ...

  4. RabbitMQ 入门之基础概念

    什么是消息队列(MQ) 消息是在不同应用间传递的数据.这里的消息可以非常简单,比如只包含字符串,也可以非常复杂,包含多个嵌套的对象.消息队列(Message Queue)简单来说就是一种应用程序间的通 ...

  5. Angular 的前世今生

    目录 序言 AngularJS 简介 Angular 2.0 的动机 现如今的 Angular Angular 的核心概念 参考 序言 Angular 一般意义上是指 Angular v2 及以上版本 ...

  6. Nginx使用SSL模块配置https

    背景 开发微信小程序,需要https域名,因此使用Nginx的SSL模块配置https 步骤 一.去域名管理商(如腾讯云.阿里云等)申请CA证书 二.在Nginx中配置,一般情况下域名管理商会提供配置 ...

  7. idea中maven导入依赖报红的解决办法

    使用idea创建maven项目,maven导入依赖报红,从以下几个步骤排查解决问题: 1.首先查看maven的安装和配置有没有问题.那么,要看那些内容呢.maven的安装位置.maven的settin ...

  8. 把若依管理系统部署到Linux

    一.前言 1.非常感谢若依作者为大家提供的非常优质的开源web项目,非常感谢!!! 2.若依官方文档:http://doc.ruoyi.vip/ruoyi/ 3.若依官方链接: 1)若依管理系统官方体 ...

  9. web自动化 -- ActionChains()的鼠标操作

    webdriver模块下的ActionChains类 一.两个主要组件 1.实例化  ActionChains() 2.ActionChains(driver).perform() perform() ...

  10. Mysql concat() group_concat()用法

    数据库表: 关键字:concat 功能:将多个字符串连接成一个字符串 使用:concat(column1, column2,...)  字段中间可以加连字符 结果:连接参数产生的字符串,如果有任何一个 ...