欢迎有兴趣的朋友,参与我的美女同事发起的活动《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天吃掉大象的更多相关文章

  1. swift语言之多线程操作和操作队列(下)———坚持51天吃掉大象(写技术文章)

    欢迎有兴趣的朋友,参与我的美女同事发起的活动<51天吃掉大象>,该美女真的很疯狂,希望和大家一起坚持51天做一件事情,我加入这个队伍,希望坚持51天每天写一篇技术文章.关注她的微信公众号: ...

  2. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  3. HDFS简单介绍及用C语言訪问HDFS接口操作实践

    一.概述 近年来,大数据技术如火如荼,怎样存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有很广 ...

  4. YTU 2974: C语言习题5.26--文件操作3

    2974: C语言习题5.26--文件操作3 时间限制: 1 Sec  内存限制: 128 MB 提交: 213  解决: 92 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编号 ...

  5. YTU 2973: C语言习题5.25--文件操作2

    2973: C语言习题5.25--文件操作2 时间限制: 1 Sec  内存限制: 128 MB 提交: 242  解决: 105 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编 ...

  6. YTU 2972: C语言习题5.24--文件操作1

    2972: C语言习题5.24--文件操作1 时间限制: 1 Sec  内存限制: 128 MB 提交: 248  解决: 94 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编号 ...

  7. C语言对mysql数据库的操作

    原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正 ...

  8. 使用c语言实现linux数据库的操作

    前言:上一篇讲解了linux下使用命令行操作数据库,这篇继续讲解怎么使用c语言实现linux数据库的操作. 使用c语言实现环境搭建:既然我们要使用c语言实现linux数据库操作,那么首先我们得先把数据 ...

  9. 在Go语言中基础的Redis操作

    在Go语言中基础的Redis操作 需要先安装redigo go get "github.com/garyburd/redigo/redis" Go语言Redis客户端的简单示例 连 ...

随机推荐

  1. 5.5 Selenium2中的元素定位

    WebDriver的更加面向对象的方式大大降低了Selenium的入门门槛,对Web元素的操作也非常之简单易学.实际项目用起来,工作量最大的部分就是你如何解析定位到你的目标项目页面中的各种元素.好比你 ...

  2. jmeter 建立一个JMS点对点测试计划

      确保所需的jar文件在JMeter的 自由 目录中. 如果他们不是,关闭JMeter, 重启JMeter复制jar文件. 看到 开始 获取详细信息.   测试的设置是1与5线程发送4 thread ...

  3. Android 禁止Viewpager左右滑动功能

    首先自定义一个 继承自 ViewPager的自定义 类 package com.yourcompany; import android.content.Context; import android. ...

  4. Ubuntu 系统下 mongodb 安装和配置

    安装 MongoDB sudo apt-get install mongodb sudo apt-get install mongodb 关闭/启动 sudo service mongodb stop ...

  5. 发布完ArcGIS地图服务后,服务未启动成功

    今天下午更新地图服务后,服务未启动成功.出来的弹出框警告问题目前应该是ArcGIS Server出了问题,打开ArcCatalog目录,查看GIS服务器下localhost下的服务,只要是今天发布的服 ...

  6. 设置JVM参数,查看堆大小

    1.在eclipse设置JVM参数     打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效,也就是在eclipse中运行的java程序)编辑当前 ...

  7. BZOJ2621 [Usaco2012 Mar]Cows in a Skyscraper

    首先比较容易想到是状态压缩DP 令$f[S]$表示选取了集合$S$以后,已经送了最少次数$cnt$且当前电梯剩下的体积$rest$最大(即$f[S]$是一个二元组$(cnt, rest)$) 于是$f ...

  8. CSS3学习教程:Media Queries详解

    说起CSS3的新特性,就不得不提到 Media Queries . Media Queries 的引入,其作用就是允许添加表达式用以确定媒体的情况,以此来应用不同的样式表.换句话说,其允许我们在不改变 ...

  9. LAMP整理

    LAMP第一部分 查看编译了哪些软件:是编译时自动生成的 Cat /usr/local/apache2/build/config.nice 网站根目录存放处: /usr/local/apache2/h ...

  10. Net开发环境配置

    Web开发插件: 1.JSEnhancements js和css折叠插件 可以参见dudu的介绍不错的VS2010扩展——JSEnhancements,让js和css也折叠 下载地址:http://v ...