在iOS开发中,有三种多线程处理方式:

  1. 利用NSThread

  2. NSOperation和NSOperationQueue

  3. 利用GCD(Grand Central Dispatch)

  使用上,从1到3是越来越简单,但是,对于1和2还是需要了解一下,了解本质有利于在出现一些bug时思考得更深入一些。


  下面从1开始,记录使用流程:

  1. NSThread

    

    iOS和Android一样,只能在UI线程更新UI界面,如果在子线程需要更新UI控件,需要执行[self performSelctrorOnMainThread: withObject: waitUntilDone:]来进行更新操作。

    第一次运行输出如下:

    

    第二次运行输出如下:

    

    可以看到,虽然启动了线程,但是不是一启动就进入执行状态,CPU会在线程之间切换执行,线程就会在运行、就绪状态间切换,如需调用start函数后(此时线程处于就绪态)马上切换到运行态,可在主线程调用此函数: [NSThread sleepForTimeInterval:0.001]让线程休眠一下,进入阻塞状态,然后等待CPU调度,如果想让线程有更多的运行机会,可以调整优先级,默认优先级为0.5:

    

    结果如下:

    

    在子线程出现如下情况会自行终止:

    1. 线程逻辑函数处理完成

    2. 线程执行中发生异常

    3. 调用了[NSThread exit]

    注意:主线程结束后,由主线程启动的子线程不会跟随终止,可以如下在UI线程终止子线程,利用发生cancle信号:

    程序和运行结果如下:

    

    

    这里设定500毫秒后发送终止子线程信号,子线程判断收到cancel信号后终止自己。

  2. NSOperation与NSOperationQueue

    NSOperationQueue是一个FIFO队列,负责管理系统提交的多个NSOperation。

    NSOperation类型Java里的Runnable接口,代表一个多线程任务,它有NSInvocationOperation和NSBlockOperation两个子类(用于封装需要异步执行的任务),这两个子类可以直接使用,或者开发者可以自己继承NSOperation来实现自己的子类。

    开发步骤:

    1. 创建NSOperationQueue队列,设置其属性

    2. 创建NSOperation子类的对象,然后将对象提交到NSOperationQueue队列,队列将按顺序依次启动每个NSOperaion。

    示例:

    

    可以看到,这里开启了两个线程来处理任务。

  3. GCD

    核心概念:

    队列:在底层维护一个线程池,使用FIFO方式管理开发者提交的任务,有串行队列和并发队列

    任务:开发者提交给队列的工作单元,这些任务会交由队列底层的线程池内执行

    开发步骤:

    1. 创建队列

    2. 将任务提交给队列

    示例:

    

    这里创建了一个串行队列和一个并发队列并且都以异步方式提交任务。在输出中可以发现,在串行队列中,会先后执行代码块,而在并发队列中,会并发执行代码块。

    另外,还有dispatch_once可以让代码只运行一次,通常用于单例模式,dispatch_apply可以让代码重复运行多次,这里就不进行测试了。

iOS多线程笔记的更多相关文章

  1. iOS 多线程学习笔记 —— GCD

    本文复制.参考自文章:iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http:// ...

  2. iOS 多线程学习笔记 —— NSOperation

    本文复制.参考自文章:iOS多线程编程之NSOperation和NSOperationQueue的使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://b ...

  3. iOS 多线程学习笔记 —— NSThread

    本文复制.参考自文章:iOS多线程编程之NSThread的使用  ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://blog.csdn.net/totogo ...

  4. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  5. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  6. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

  7. 菜鸟手下的iOS开发笔记(swift)

    在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...

  8. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  9. iOS学习笔记17-FMDB

    上一节我已经介绍了SQLite的简单使用,不了解的可以提前去看一下iOS学习笔记16-数据库SQLite,这节我们来讲下FMDB. 一.FMDB介绍 FMDB是一种第三方的开源库,FMDB就是对SQL ...

随机推荐

  1. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(二)

    Log4j 这个东西,大家都熟悉,就简单的介绍一下,算是一个抛砖引玉,因为我自己在Log日志的搭建方面,没有什么经验,但这东西确实是非常重要的,日后调Bug没有它基本不可能,如果有朋友有什么比较好的L ...

  2. 网站引入了css样式文件能访问,就是没有效果

    今天后端的同事遇到这么个问题,引入了外部css文件也能访问,就是页面上没有效果. 大概是下面这个样子: css引入如下: 我非常的纳闷,说真的我还没遇到过这种情况,UI是可以运行的,一点事都没有... ...

  3. 制作宅基腐主页 && 制作个人简历--材料:BootStrap

    宅基腐主页 主页分为四大板块:导航栏,轮播图,主页内容,相关信息. 导航栏:<nav>标签,class="navbar",navbar-inverse为反色,navba ...

  4. bootstrap学习笔记--bootstrap概览

    HTML 5 文档类型(Doctype) Bootstrap 使用了一些 HTML5 元素和 CSS 属性.为了让这些正常工作,您需要使用 HTML5 文档类型(Doctype). 因此,请在使用 B ...

  5. 【转】[Intel/Nvidia]Ubuntu 16.04 LTS Intel/Nvidia双显卡切换

    1.在Unity中搜索 "Additional Drivers" 2.打开并选择以下选项 3.打开终端并输入 sudo apt-get install nvidia-361 4.安 ...

  6. linux指令学习笔记(一)

    1. 查看目录下有什么文件/目录    > ls            //list列出目录的文件信息    > ls  -l 或ll   //list -list以“详细信息”查看目录文 ...

  7. 关于MySQL存储过程中遇到的一个错误

    执行结果: 查询:)) comment '操作变量' begin set var='MySQL%Orcle%DeLL%IBM'; select replace(var,'%'... 共 行受到影响 执 ...

  8. python网络编程学习笔记(三):socket网络服务器(转载)

    1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较. 步骤 TCP客户端 TCP服务器 第一步 建立socket对象  建立socket对 ...

  9. TCP学习之一:TCP网络编程概念

    参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html 一.TCP 面向连接的(UDP是无连接的) 全双工,建立连接之后 ...

  10. Timequest GUI

    Tasks界面 使用Tasks界面可以访问常用命令,例如生成网表建立报告等. 两个常用命令位于Tasks界面中:打开工程和编写SDC文件.其他命令在下面的文件夹中: Netlist Setup Rep ...