swift语言之多线程操作和操作队列(上)———坚持51天吃掉大象
欢迎有兴趣的朋友,参与我的美女同事发起的活动《51天吃掉大象》,该美女真的很疯狂,希望和大家一起坚持51天做一件事情,我加入这个队伍,希望坚持51天每天写一篇技术文章。关注她的微信公众号:zhangmanyuheart了解更多吧。
前言:今天学习了半天的网络和多线程的内容,然后想起其中的例子和我曾经看过的一篇外文的内容非常相似,它们都对我理解网络和多线程有极大的帮助,因此决定找来这篇文章翻译作为的坚持51天吃掉大象(写技术文章)的第二天的技术文章,也对这自己今天的学习做个总结。原文出处:http://www.raywenderlich.com/76341/use-nsoperation-nsoperationqueue-swift
咳,不得不说我们这些年轻人都是电子产品重度使用者,也都经历过因为软件卡顿而气的恨不能够一句咒语毁灭地球或者一巴掌毁灭自己。
现在有价值的app都需要能够多任务同时进行来满足用户的需求,但有个矛盾点就是:主线程不能执行耗时操作同时又保证及时响应用户操作,因此对我们开发者而言,就需要毁灭自己之前也要把这个问题解决,这样才能拯救人类。
我们开发者可以通过并发的方式将一些操作放到主线程之外的线程上执行,从而不影响交互界面保持响应能力。
本文将介绍NSOperation(操作) 和 NSOperationQueue(操作队列),来实现并发。教程从一个不使用并发技术的app样例开始,您下载下来试运行下就会明白操作它是多么痛苦的事情,确实又慢又卡,然后我们跟着教程一步一步改善它,最终效果会非常的nice,用起来会流畅许多。
让我们开始吧!
关于起始程序
样例主要功能就是通过tableview,展示一些添加滤镜效果的的图片。图片从网络上下载,然后添加滤镜,最后显示在表格视图上。
模型示意图如下:

大概对app样例了解之后,就可以下载样例下来体验一把。下载地址:http://cdn5.raywenderlich.com/wp-content/uploads/2014/10/ClassicPhotos-Starter63.zip
编译并运行。你将会看到下图相似的效果,app显示一个图片列表,但是向下滑动,就会发现非常的卡顿有木有。

看看代码你就会发现几乎所有的操作都写在 ListViewController.swift类中,而且主要集中在tableView(_:cellForRowAtIndexPath:)方法中。该方法主要实现以下两个作用。
1.从互联网上加载图片。尽管实现起来容易,但是app必须要等待图片加载完成才能继续操作。
2.使用core image 给图片添加滤镜。
所有这些工作都是在主线程上执行,然而主线程又需要响应用户操作。而加载图片和添加滤镜本身又是耗时操作,所以不可避免就会导致无法及时响应用户的操作。我们可以在程序调试过程中,通过 Debug navigator (Command-6)查看cpu和内存的使用情况,如图:

从图中可以看到,所有的耗时操作都是在主线程上。
了解了这个app之后,我们现在开始来着手改进它,不过在开始之前我们先了解一些概念。
1.任务:一个需要app完成的一件简单的事情或操作。
2.线程:操作系统提供给的一种机制,该机制允许多个指令同时在一个程序中运行。
3.进程。一大段可执行的代码,一般会有多个线程组成。
下面这个图可以很好的解释进程,线程和任务之间的关系。

从图中可以了解到,一般一个进程会包含一个或者多个线程,一个线程也会包含一个或者多个任务。
NSOperation操作 和 Central Dispatch(GCD)比较
NSOperation操作 和 Central Dispatch(GCD)是在GCD之上做了一次更高层级的封装,苹果也推荐我们使用更高级别的方法,当然也需要根据实际需要决定。
以下是对两者的快速比较,它会帮助你决定何时何地去使用GCD或者NSOperation和NSOperationQueue。
1.GCD提供了一个轻量级的执行多个并发任务单元的解决方案。我们开发者不需要关心多个任务之间是如何调度的,因为系统会自动帮我们调度。不过也正因为如此,我们想更好的控制代码块的执行依赖顺序也变的头疼了,取消和暂停一个任务也非常的困难。
2.NSOperation操作。可能比GCD稍微要难使用点,但也意味着你可以更好的控制多个任务的依赖关系从而控制任务的执行顺序,取消和暂停。
好了,现在我们就来通过NSOperation技术来优化我们的程序吧。
swift语言之多线程操作和操作队列(上)———坚持51天吃掉大象的更多相关文章
- swift语言之多线程操作和操作队列(下)———坚持51天吃掉大象(写技术文章)
欢迎有兴趣的朋友,参与我的美女同事发起的活动<51天吃掉大象>,该美女真的很疯狂,希望和大家一起坚持51天做一件事情,我加入这个队伍,希望坚持51天每天写一篇技术文章.关注她的微信公众号: ...
- 使用EasyNetQ组件操作RabbitMQ消息队列服务
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...
- HDFS简单介绍及用C语言訪问HDFS接口操作实践
一.概述 近年来,大数据技术如火如荼,怎样存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有很广 ...
- YTU 2974: C语言习题5.26--文件操作3
2974: C语言习题5.26--文件操作3 时间限制: 1 Sec 内存限制: 128 MB 提交: 213 解决: 92 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编号 ...
- YTU 2973: C语言习题5.25--文件操作2
2973: C语言习题5.25--文件操作2 时间限制: 1 Sec 内存限制: 128 MB 提交: 242 解决: 105 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编 ...
- YTU 2972: C语言习题5.24--文件操作1
2972: C语言习题5.24--文件操作1 时间限制: 1 Sec 内存限制: 128 MB 提交: 248 解决: 94 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编号 ...
- C语言对mysql数据库的操作
原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正 ...
- 使用c语言实现linux数据库的操作
前言:上一篇讲解了linux下使用命令行操作数据库,这篇继续讲解怎么使用c语言实现linux数据库的操作. 使用c语言实现环境搭建:既然我们要使用c语言实现linux数据库操作,那么首先我们得先把数据 ...
- 在Go语言中基础的Redis操作
在Go语言中基础的Redis操作 需要先安装redigo go get "github.com/garyburd/redigo/redis" Go语言Redis客户端的简单示例 连 ...
随机推荐
- 提高PHP开发质量的36个方法(精品)
提高PHP开发质量的36个方法 林涛 发表于:2016-3-25 0:00 分类:26点 标签: 62次 1.不要使用相对路径 常常会看到: require_once('../../lib/some_ ...
- foreach 相关
20 Nov 08 深入理解PHP原理之foreach 作者: Laruence( ) 本文地址: http://www.laruence.com/2008/11/20/630.html 转载请注 ...
- tomcat集群配置
http://www.finereporthelp.com/help/24/1/3/3.html#a:4.1
- php中的 == 和 ===
== 是等值 1 和 ‘1’ 是相等的 === 要等值并且类型相等,比如 1 和 ‘1’ 是不相等的,只有 ‘1’ 和 ‘1’ 是相等的.哈哈哈. http://ihacklog.com/post ...
- android UI库
https://github.com/wasabeef/awesome-android-ui List of Android UI/UX Libraries A curated list of awe ...
- appium支持中文输入
Appium 1.3.3以上.java:capabilities增加下面两项:capabilities.setCapability("unicodeKeyboard", " ...
- JSP action elements - JavaBean
语法 描述 jsp:include 在页面被请求的时候引入一个文件. jsp:useBean 寻找或者实例化一个JavaBean. jsp:setProperty 设置JavaBean的属性. jsp ...
- JavaWeb基础: 第一个Web应用(Servlet)
Servlet的生命周期 <servlet-mapping>和<servlet> Web应用的用户是通过指定浏览器中URL地址来访问Web应用提供的静态或者是动态资源,如果Se ...
- 第四周 技术随笔psp
本周psp 类型 内容 开始时间 结束 打断时间 净时间 写随笔 Scrum会议 23:46 00:27 0 41分
- Javascript的"预编译"思考
今天工作需要,搜索下JS面试题,看到一个题目,大约是这样的 <script> var x = 1, y = z = 0; function add(n) { n = n+1; } y = ...