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. tcpdump dns包(linux高性能编程读书笔记2)

      tcpdump -i eth0 -nt -s 500 port domain host -t A www.baidu.com www.baidu.com is an alias for www.a ...

  2. Javascript类型转换表

    各种类型的值 转换为各种类型 String Number Boolean Object undefined "undefined" NaN false 报错 null " ...

  3. 获取子窗口中使用jQuery.data()设置的参数

    http://hyj1254.iteye.com/blog/643035 假设在iframe子窗口中设置了$('#mydata').data('key','hello world'); 那在包含ifr ...

  4. C# 必应代码搜索

    微软宣布推出必应代码搜索服务,暂时只支持 C# 语言,日后将支持更多代码语言. Visual Studio 用户安装必应搜索插件之后可使用该服务来简化编程任务.Visual Studio 与 MSDN ...

  5. Problem About Salesforce SOAP API 32.0 In .Net Project

    最近在集成项目项目中遇到一个问题:在用最新版本(API 32.0)Enterprise WSDL在.Net 中做集成时,初始化SforceService 时会初始化类错误.这算是Salesforce ...

  6. Spark on Yarn遇到的几个问题

    1 概述 Spark的on Yarn模式,其资源分配是交给Yarn的ResourceManager来进行管理的,但是目前的Spark版本,Application日志的查看,只能通过Yarn的yarn ...

  7. SCAU 13校赛 17115 ooxx numbers

    17115 ooxx numbers 时间限制:1000MS  内存限制:65535K 题型: 编程题   语言: 无限制 Description a number A called oo numbe ...

  8. 【转】Eclipse去除js(JavaScript)验证错误

    这篇文章主要是对Eclipse去除js(JavaScript)验证错误进行了介绍.在Eclipse中,js文件常常会报错.可以通过如下几个步骤解决 第一步:去除eclipse的JS验证:将window ...

  9. c++,windows中的字符问题

    string与char*的转换方法 string a; char *b=a.c_str(); string a=new String(b); a=b; LPCWSTR是unicode的字符串,LPCS ...

  10. Mongo数据模型

    Mongo数据模型 一个Mongo系统(参考上述部署)包含一组数据库 一个 database 包含一组collection 一个 collection 包含一组document 一个 document ...