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
相关文章
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
24天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
117 66
|
10天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
1月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
101 3
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
2月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
2月前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
2月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
2月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
36 2
|
2月前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
60 9