在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. POJ 2253 Frogger(Dijkstra)

    传送门 Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39453   Accepted: 12691 Des ...

  2. Docker 学习之命令详解

    1. docker version docker version 显示 Docker 版本信息. 2. docker info docker info 显示 Docker 系统信息,包括镜像和容器数. ...

  3. Noise Contrastive Estimation

    Notes from Notes on Noise Contrastive Estimation and Negative Sampling one sample: \[x_i \to [y_i^0, ...

  4. ionic 发布 inoc显示不正确

    前两天因为学习的问题,把本地环境给搞崩了,然后重新安装环境之后发现生成的安装包不能使用,然后找了很多原因都不能解决,因为之前发布ios的时候使用命令 ionic resources的时候就可以将图标显 ...

  5. Java学习笔记-按值传递

    参数的值传递 实参必须与方法中次你故意的参数在次序和数量上匹配,在类型上兼容.类型兼容是指不需要经过显式的类型转换,实参的值就可以传递给形参.如将int型的实参值传递给double型形参. 当调用方法 ...

  6. 浅谈Nginx负载均衡和F5的区别

    前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处 ...

  7. emulator control无法使用问题

    请使用Google 自带的控制器:

  8. Placeholder在IE8的兼容问题

    <script type="text/javascript"> if( !('placeholder' in document.createElement('input ...

  9. ubuntu mysql使用

    用navicat远程连不上mysql,提示10061错误解决办法: 修改/etc/mysql/my.cnf文件,找到127.0.0.1行,注释该行 命令:vi my.cnf 按i键进入编辑模式 编辑完 ...

  10. 【IOS】将字体大小不同的文字底部对齐

    从WP转IOS了,还是放不下...... 在项目中,要实现如图多个不同大小的文字   底部对齐的效果   像下面这样: (想要的效果) 以为用三个UIFont不同的UILabel  之后让他们底部对齐 ...