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

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

什么是多线程?

一个进程的开始阶段系统会分配一个主线程进行正常的工作,工作过程中是依次执行的,只有这个任务执行完毕的时候才能执行下一个任务,两个或多个任务不能同时执行。这样的工作效率是低效的,因此就引入了多线程,能够利用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
相关文章
|
4天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
112 1
|
1月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
1月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
66 1
|
11天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
32 9
|
7天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
11天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
9天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
12天前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
16天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第31天】在这篇文章中,我们将一起踏上iOS开发的旅程。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。我们将从基础开始,逐步深入到更高级的技术和概念。让我们一起探索iOS开发的世界吧!