IOS编程之多线程

目录

  • 概述——对多线程的理解
  • IOS中实现多线程的三种方式

NSThread

线程创建

线程的同步与锁

线程间的交互

线程的操作方法

NSOperation and NSOperationQueue

GCD(Grand Central Dispatch)

  • 线程间的通信
  • 解决多个线程同时访问同一个内存资源的问题
  • 多线程的运用

卖火车票

  • 对多线程底层的可能实现的猜测

概述——对多线程的理解

为了避免在主线程中执行一些任务时可能会出现异常而卡死,我们可以把这些任务放到新的线程中进行执行,即使出现异常,主线程也依旧可以做取消操作的响应;同时,有时我们为了让用户拥有更好的体验,我们也常常把对界面、网络请求和应答等等的处理放到新的线程中进行,而不会因为有时很久的处理而让用户不能去操作其他只能够等待操作完成

IOS中实现多线程的三种方式

NSThread

概述

优缺点

优点:易理解,创建快

缺点:需要写很多相关方法,不便于代码的维护

线程创建

-(id)init;

-(id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

注:以上的两种方法创建线程之后需要手动启动,启动方法:-(void)start;

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument;

注:以上方法直接生产一个线程并启动它

线程的同步与锁

IOS使用NSCondition来进行线程同步,它是IOS的所对象,用来保护当前访问的资源

使用方法

NSCondition *myLock = [[NSCondition alloc] init];

[myLock lock];

资源..

[myLock unLock];

线程间的交互

调用主线程的指定方法来执行相关操作

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

线程的操作方法

//返回当前线程
+ (NSThread *)currentThread;

// 通过类方法创建一个线程
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;

// 判断是否为多线程
+ (BOOL)isMultiThreaded;

- (NSMutableDictionary *)threadDictionary;

+ (void)sleepUntilDate:(NSDate *)date;

+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

//  退出线程
+ (void)exit;

// 线程属性值
+ (double)threadPriority ;
+ (BOOL)setThreadPriority:(double)p ;

// 线程函数地址
+ (NSArray *)callStackReturnAddresses;

// 设置与返回线程名称
- (void)setName:(NSString *)n;
- (NSString *)name;

// 线程堆栈
- (NSUInteger)stackSize;
- (void)setStackSize:(NSUInteger)s;

// 判断当前线程是否为主线程
- (BOOL)isMainThread;
+ (BOOL)isMainThread;

+ (NSThread *)mainThread;

// 线程对象初始化操作   (通过创建线程对象 ,需要 手工指定线程函数与各种属性)
- (id)init;

// 在线程对象初始化时创建一个线程(指定线程函数)
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

// 是否在执行
- (BOOL)isExecuting;

// 是否已经结束 
- (BOOL)isFinished;

// 是否取消的
- (BOOL)isCancelled;

// 取消操作
- (void)cancel;

// 线程启动
- (void)start;

- (void)main;    // thread body method

NSOperation and NSOperationQueue

概述

NSInvocationOperation是NSOperation的子类;

NSOperation是不能直接拿来调用的,使用其定义好的子类NSInvocationOperation或者自定义其子类重写main方法;

通过NSOperationQueue中的addOperation:方法来添加操作,然后系统会自动执行相关操作;

队列里可以加入很多个NSOperation, 可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。线程池中的线程可看作消费者,从队列中取走操作,并执行它。

通过的代码设置:[queue setMaxConcurrentOperationCount:5];

线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作

操作对象的创建

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector( ) object: ];

将操作对象添加到系统已有的操作队列里,这是是以一个线程的方式与主线程分开执行

[[MyAppDelegate sharedOperationQueue] addOperation:operation];

我们也可以使用NSOperationQueue创建自己的线程队列

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];

[operationQueue setMaxConcurrentOperationCount:   ];

[operationQueue addOperation:operation];

GCD(Grand Central Dispatch)

概述

优缺点

优点:对相关事件的处理都集中于一个地方,不用写很多个方法去实现某一功能

缺点:代码可读性差

举例

dispatch_async(dispatch_queue_create("threadName",DISPATCH_QUEQU_SERIAL),^{

  dispatch_sync(dispatch_get_main_queue( ),^{

    //主线程

  }

}

注意问题

同步和异步;

什么时候用同步什么时候用异步;

线程数,超出预设的线程数的最大值会怎样,为什么要设线程数;

执行的线程有没有优先级,执行完成有没有先后顺序;

线程间通信;

线程安全,如何让一个方法未执行完之前第二个方法不可以执行;

IOS编程之多线程的更多相关文章

  1. iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)

    简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...

  2. iOS开发之多线程技术

    本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...

  3. OS X 和iOS 中的多线程技术(下)

    OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...

  4. iOS开发-多线程开发之线程安全篇

    前言:一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,比如多个线程访问同一个对象.同一个变量.同一个文件和同一个方法等.因此当多个线程访问同一块资源时,很容易会发生数据错误及数据不安 ...

  5. iOS开发之多线程技术(NSThread、OperationQueue、GCD)

    在前面的博客中如果用到了异步请求的话,也是用到的第三方的东西,没有正儿八经的用过iOS中多线程的东西.其实多线程的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解多线程的东西还是比较容易的 ...

  6. [译] 二、开始iOS编程之前,你还需要做什么?

    声明:本文翻译自AppCoda网站的文章:What You Need to Begin iOS Programming?,作者是创建者Simon Ng.如有异议,请联系博主.   更新:帖子已经重新被 ...

  7. C# winform编程中多线程操作控件方法

    private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...

  8. IOS编程User Interface基础

    IOS编程之User Interface基础 目录 概述 相关概念 常见问题 状态栏的隐藏 应用图标的设置 概述 IOS用户界面是APP呈现给用户最直观.最常用的方式,因此学会用户界面的编程是学习IO ...

  9. iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)

    iOS编程——通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版) 很多的应用都需要用到手机的唯一标示,而且要求这个唯一标示不能因为应用app的卸载或者改变而变化. 在iO ...

随机推荐

  1. SpringMVC + Spring + MyBatis 学习笔记:在类和方法上都使用RequestMapping如何访问

    系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 先看代码: @Requ ...

  2. c语言的几个重要知识点

      内存结构 这是核心中的核心,请仔细看完,充分理解,否则请不要看下一节内容. 每个程序一启动都有一个大小为4GB的内存,这个内存叫虚拟内存,是概念上的,真正能用到的,只是很小一部分,一般也就是在几百 ...

  3. httpcomponents 学习1--并发多线程GET

    package org.apache.http.examples.client; import org.apache.http.HttpEntity; import org.apache.http.H ...

  4. 使用MockMvc测试Spring mvc Controller

    概述   对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便 ...

  5. 轻松学习Linux之VI编辑器的使用

    本文出自 "李晨光原创技术博客" 博客,谢绝转载!

  6. MetaQ安装部署文档

    一.MetaQ安装部署情况: 地点 IP Broker ID Master/Slave Slave ID:Group 合肥 192.168.52.23 Slave 1:meta-slave-group ...

  7. Gym 101064 D Black Hills golden jewels (二分)

    题目链接:http://codeforces.com/gym/101064/problem/D 问你两个数组合相加的第k大数是多少. 先sort数组,二分答案,然后判断其正确性(判断过程是枚举每个数然 ...

  8. HDU 5828 Rikka with Sequence (线段树+剪枝优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5828 给你n个数,三种操作.操作1是将l到r之间的数都加上x:操作2是将l到r之间的数都开方:操作3是 ...

  9. ebj笔记

    所有EJB3.0开发商都必须提供一个JMS provider的实现,JMS provider对于message-driven bean而言绝对是必须的.JMS是一套用于访问企业消息系统的开发商中立的A ...

  10. 10个经典的Java main 方法面试题

    1. 不用main方法如何定义一个类? 不行,没有main方法不能运行Java类. 在Java 7之前,你可以通过使用静态初始化运行Java类.但是,从Java 7 开始就不行了. 2. main() ...