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. Winform後台如何動態修改App.config文件里的內容

    以下方法修改的,自己添加的app.config裡面不會顯示出修改的東西. 方法一:通過使用System.Xml.XmlDocument對象的方法進行bin\debug\~.vshost.exe.Con ...

  2. Scrum流程

    敏捷Scrum流程图: Sprint Planing Meeting: 1.Next Spring Goal; 2.Sprint Backlog; 3.Updated Product Backlog; ...

  3. fdquery update

    fdquery  update this->FDQuery1->CachedUpdates; this->FDQuery1->UpdateOptions->KeyFiel ...

  4. CameraComponent Quality

    CameraComponent1.Quality := TVideoCaptureQuality.HighQuality; procedure TCameraComponentForm.Set720p ...

  5. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  6. 导出Excel Gridview

    /// <summary>    /// 定义导出Excel的函数    /// </summary>    /// <param name="FileType ...

  7. stm32 usb数据接收与数据发送程序流程分析

    http://blog.csdn.net/u011318735/article/details/17424349 既然学习了USB,那就必须的搞懂USB设备与USB主机数据是怎么通讯的.这里主要讲设备 ...

  8. linux下 ls 排序

    ls -lS                       按大小降序排列 ls -l | sort -n -k5    按大小升序 ls -lrt                       按时间降 ...

  9. 几种连接不同数据库的ADO.NET字符串

    Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;或者 Ser ...

  10. date之Hi时间的思考

    工作中用到需要一个判断当前时间是否在 23:50到1:00之间的一段程序,在和别人的讨论中基本上有以下两种做法 1.分别获取时分进行判断和比较 <?php function check_time ...