iOS多线程开发系列之(一)NSThread

什么是多线程?

一个进程的开始阶段系统会分配一个主线程进行正常的工作,工作过程中是依次执行的,只有这个任务执行完毕的时候才能执行下一个任务,两个或多个任务不能同时执行。这样的工作效率是低效的,因此就引入了多线程,能够利用iPhone设备多核的优势同时并发的处理多个事件。

三种多线程技术:

1.NSThread
2.NSOperation、NSOperationQueue
3.GCD

分析三种技术

这三种技术从上到下封装性逐步降低、造成逐步复杂、高效性逐步提升,GCD是基于C语言开发的,最底层、用起来比较麻烦些,但效率最高。

  • NSThread:

    • 优点:轻量级、比较简单
    • 缺点:需要程序员管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销
  • NSOperation:
    • 不需要像NSThread那样关心线程管理、数据同步的事情、程序员的主要工作放在执行的操作上
  • GCD:
    • GCD是苹果在iOS4.0以后使用的一种技术、比上两个技术更强大和高效
    • 操作起来比较麻烦些、基于C语言开发的

深入学习之前我们先看一个例子看下多线程的强大

假设性开发:我们输入账号密码登录QQ后,会出现我们的昵称、等级、聊天记录、好友图片以及自己的图片。我们知道:图片的加载是最消耗性能、最耗时和耗费流量、当用户处于2G/3G或者WIFI状态非常不好的状态,倘若我们不引进多线程会怎么样应该是登录后用户迟迟不能进行操作,唯有所有数据都加载完毕之后才能进行,这样的用户体验是非常糟糕的。
下面用伪代码进行模拟 ,我们在上面加入时间宏函数,测试一下登录成功到可以操作所需时间

 #define STARTTIME NSDate *startTime=[NSDate date];

#define ENDTIME  NSLog(@"Time: %f", -[startTime timeIntervalSinceNow]);
STARTTIME//开始计时
 NSLog(@"用户登录成功----");
NSLog(@"正在加载用户昵称----");

for(int i=0;i<10000;i++)
{
    NSLog(@"正在加载用户好友的数据信息");
}
for(int i=0;i<10000;i++)
{
    NSLog(@"正在加载用户好友的图片信息");
}
for (int i=0; i<10000; i++) {
    NSLog(@"正在加载用户与好友的聊天信息");
}
NSLog(@"所有加载完毕,用户可以操作了");
 ENDTIME//结束计时


经过模拟,发现,所有操作在主线程中进行,至少用户在登录9.5秒内是没法操作的,这样的操作跟安卓手机有什么区别?卡的XX一样,谁还用iPhone?不明觉厉之后就该好好研究一下多线程啦!



好啦,我们开始逐步学习这三种方法:

NSThread:

分三步轻轻松松实现多线程:

  1. 创建一个线程类

     NSThread *thread1=[[NSThread alloc]initWithTarget:self selector:@selector(startLoad1) object:nil];
    

    2.实现相应的方法 ,把耗时操作放入多线程方法中

    -(void)startLoad1
    {
        for(int i=0;i<10000;i++)
    {
        NSLog(@"正在加载用户好友的数据信息");
     }
    }
    

3.开启线程

 [thread1 start];

于是上面的代码被我们改为:

- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"用户登录成功----");
NSLog(@"正在加载用户昵称----");
//申请开辟线程
NSThread *thread1=[[NSThread alloc]initWithTarget:self selector:@selector(startLoad1) object:nil];
NSThread *thread2=[[NSThread alloc]initWithTarget:self selector:@selector(startLoad2) object:nil];
NSThread *thread3=[[NSThread alloc]initWithTarget:self selector:@selector(startLoad3) object:nil];
[thread1 start];//开启线程
 [thread2 start];
[thread3 start];
NSLog(@"所有加载完毕,用户可以操作了");

}
-(void)startLoad1//实现线程方法
{
        for(int i=0;i<10000;i++)
{
    NSLog(@"正在加载用户好友的数据信息");
}
}
-(void)startLoad2
{
for(int i=0;i<10000;i++)
{
    NSLog(@"正在加载用户好友的图片信息");
}
}
-(void)startLoad3
{

for (int i=0; i<10000; i++) {
    NSLog(@"正在加载用户与好友的聊天信息");
}
}

只要0.001338秒,对比9.5秒,多么可怕的数字呀!不明觉厉!多线程强大吧!

上面我们需要经历三步,才能创建一个子线程,再说一种NSThread的另一种方法吧,只需要两步,不需要程序员调用star函数开始线程,

创建并自动启动

[NSThread detachNewThreadSelector:@selector(startLoad1) toTarget:self withObject:nil];

NSThread 的其他边角知识:

    //取消线程
    - (void)cancel;

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

    //判断某个线程的状态的属性
    @property (readonly, getter=isExecuting) BOOL executing;
    @property (readonly, getter=isFinished) BOOL finished;
    @property (readonly, getter=isCancelled) BOOL cancelled;

    //设置和获取线程名字
    -(void)setName:(NSString *)n;
    -(NSString *)name;

    //获取当前线程信息
    + (NSThread *)currentThread;

    //获取主线程信息
    + (NSThread *)mainThread;

    //使当前线程暂停一段时间,或者暂停到某个时刻
    + (void)sleepForTimeInterval:(NSTimeInterval)time;
    + (void)sleepUntilDate:(NSDate *)date;

限于篇幅的原因(不习惯一个博客写的太长,这样读者会感觉太累),下一节我们将介绍NSOperation、NSOperationQueue
时间: 2024-10-11 12:56:55

iOS多线程开发系列之(一)NSThread的相关文章

iOS多线程开发系列之(二)NSOperation

上一篇我们简单的对iOS多线程开发系列(一)三种多线程办法进行对比性能和操作的复杂度,并认真介绍了NSThread的使用. 我们借助上一次的例子完全可以采取NSOperation方法进行实现 NSOperation不具备封装操作的能力,必须使用它的子类: NSInvocationOperation NSBlockOperation 更简洁的Block实现方法,功能上与 NSInvocationOperation基本一致 自定义子类继承NSOperation,实现内部相应的方法 NSInvocat

iOS多线程开发系列之(三)Grand Central Dispatch(GCD)

上两篇介绍了NSThread和NSOperation的用法,这篇是对第三种多线程开发GCD的介绍 介绍: GCD是苹果公司在iOS4+以后推出的多线程技术,也是苹果着力推荐的,由于基于C语言开发的,所以它的高效性无与伦比的,但学习难度可能在其他两个之上. 创建串行队列 使用dispatch_queue_create函数 使用主队列:使用dispatch_get_main_queue()获得主队列 dispatch_queue_t dispatch_queue_create(const char

iOS多线程开发——NSThread浅析_IOS

在iOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,为了学习的完整性,今天我们主要从代码层面来实现NSThread的使用.案例代码上传至 https://github.com/chenyufeng1991/NSThread. (1)初始化并启动一个线程 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated

iOS多线程开发之深入GCD

iOS多线程开发之深入GCD 一.前言         在以前的一些系列博客中,对iOS中线程的管理做了总结,其中涵盖了GCD的相关基础知识:http://my.oschina.net/u/2340880/blog/417746.那里面将GCD的线程管理能力,列队组能力,通过信号和消息控制程序流程的能力都有介绍,这里,我们继续深入GCD的功能,通过GCD来处理一些逻辑更加复杂的代码功能. 二.延时追加任务         当我们在程序中处理延时任务的时候,我们一般会通过两种方式,一种是通过定时器

IOS多线程开发之线程的状态_IOS

大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续

iOS开发系列--并行开发其实很容易

概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程

iOS开发系列--网络开发

概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession 数据请求 文件上传 文件下载 会话 UIWebView 浏览器实现 UIWebView与页面交互 网络状态 目 录 Web请求和响应 使用代理

iOS多线程编程之NSThread的使用

1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread  2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用) 3.GCD  全称:Grand Central Dispatch( iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用) 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的. 这篇我们主要介绍和使用NSThr

移动开发每周阅读清单:iOS多线程安全、构建Android MVVM应用框架

(我进去瞅了一眼又退出了.) 『移动开发每周阅读清单』第三十七期与大家见面了,上周支付宝来抢头条了,我想事情变成这样不是他们的本意,只能说产品经理还是很重要啊. 提示:点击文末阅读原文可打开带链接的版本. 提示2:文末有小福利~ 新闻 Apple 停止了 AirPort 产品线开发 根据彭博社报道,Apple 已经停止包括 AirPort Express.AirPort Extreme 等无线路由产品的开发.Apple 希望可以将人手用在带来收益更高的下一代苹果产品中.不过并不清楚苹果会在什么时