iOS开发多线程篇—NSOperation简单介绍

简介:

一、NSOperation简介

1.简单说明

NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程

NSOperation和NSOperationQueue实现多线程的具体步骤:

(1)先将需要执行的操作封装到一个NSOperation对象中

(2)然后将NSOperation对象添加到NSOperationQueue中

(3)系统会⾃动将NSOperationQueue中的NSOperation取出来

(4)将取出的NSOperation封装的操作放到⼀条新线程中执⾏

2.NSOperation的子类

NSOperation是个抽象类,并不具备封装操作的能力,必须使⽤它的子类

使用NSOperation⼦类的方式有3种:

(1)NSInvocationOperation

(2)NSBlockOperation

(3)自定义子类继承NSOperation,实现内部相应的⽅法

二、 具体说明

1.NSInvocationOperation子类

创建对象和执行操作:

复制代码
1 //创建操作对象,封装要执行的任务
2 //NSInvocationOperation 封装操作 3 NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
4 5 //执行操作 6 [operation start];
复制代码

说明:一旦执⾏操作,就会调用target的test方法

代码示例:

复制代码
 1 //  2 // YYViewController.m
 3 // 01-NSOperation基本1
 4 //  5 // Created by 孔医己 on 14-6-25.
 6 // Copyright (c) 2014年 itcast. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 11 @interface YYViewController ()
12 13 @end 14 15 @implementation YYViewController
16 17 - (void)viewDidLoad
18 {
19  [super viewDidLoad];
20 21 //NSOperation:抽象类,不具备封装功能
22 23 //创建操作对象,封装要执行的任务
24 //NSInvocationOperation 封装操作 25 NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
26 27 //执行操作 28  [operation start];
29 30 }
31 32 -(void)test
33 {
34 35 NSLog(@"--test--%@--",[NSThread currentThread]);
36 }
37 @end
复制代码

打印查看:

注意:操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行。只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

2.NSBlockOperation子类

创建对象和添加操作:

复制代码
 1 //创建NSBlockOperation操作对象  2 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
 3 //......  4  }];
 5  6 //添加操作  7 [operation addExecutionBlock:^{
 8 //....  9  }];
10 
复制代码

代码示例:

代码1:

复制代码
 1 //  2 // YYViewController.m
 3 // 02-NSTherad基本2
 4 //  5 // Created by 孔医己 on 14-6-25.
 6 // Copyright (c) 2014年 itcast. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 11 @interface YYViewController ()
12 13 @end 14 15 @implementation YYViewController
16 17 - (void)viewDidLoad
18 {
19  [super viewDidLoad];
20 21 //创建NSBlockOperation操作对象 22 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
23 NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
24  }];
25 26 27 //开启执行操作 28  [operation start];
29 }
30 @end
复制代码

打印查看:

代码2:

复制代码
 1 //  2 // YYViewController.m
 3 // 02-NSTherad基本2
 4 //  5 // Created by 孔医己 on 14-6-25.
 6 // Copyright (c) 2014年 itcast. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 11 @interface YYViewController ()
12 13 @end 14 15 @implementation YYViewController
16 17 - (void)viewDidLoad
18 {
19  [super viewDidLoad];
20 21 //创建NSBlockOperation操作对象 22 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
23 NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
24  }];
25 26 //添加操作 27 [operation addExecutionBlock:^{
28 NSLog(@"NSBlockOperation1------%@",[NSThread currentThread]);
29  }];
30 31 [operation addExecutionBlock:^{
32 NSLog(@"NSBlockOperation2------%@",[NSThread currentThread]);
33  }];
34 35 //开启执行操作 36  [operation start];
37 }
38 @end
复制代码

注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作

3.NSOperationQueue

NSOperationQueue的作⽤:NSOperation可以调⽤start⽅法来执⾏任务,但默认是同步执行的

如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作

添加操作到NSOperationQueue中,自动执行操作,自动开启线程

复制代码
 1 //创建NSOperationQueue  2 NSOperationQueue * queue=[[NSOperationQueue alloc]init];
 3 //把操作添加到队列中
 4 //第一种方式  5  [queue addOperation:operation1];
 6  [queue addOperation:operation2];
 7  [queue addOperation:operation3];
 8 //第二种方式  9 [queue addOperationWithBlock:^{
10 NSLog(@"NSBlockOperation3--4----%@",[NSThread currentThread]);
11 }];
复制代码

- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block;

代码示例:

复制代码
 1 //  2 // YYViewController.m
 3 // 03-NSOperation基本3
 4 //  5 // Created by 孔医己 on 14-6-25.
 6 // Copyright (c) 2014年 itcast. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 11 @interface YYViewController ()
12 13 @end 14 15 @implementation YYViewController
16 17 - (void)viewDidLoad
18 {
19  [super viewDidLoad];
20 21 //创建NSInvocationOperation对象,封装操作 22 NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
23 NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
24 //创建对象,封装操作 25 NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
26 NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
27  }];
28 [operation3 addExecutionBlock:^{
29 NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
30  }];
31 32 //创建NSOperationQueue 33 NSOperationQueue * queue=[[NSOperationQueue alloc]init];
34 //把操作添加到队列中 35  [queue addOperation:operation1];
36  [queue addOperation:operation2];
37  [queue addOperation:operation3];
38 }
39 40 -(void)test1
41 {
42 NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
43 }
44 45 -(void)test2
46 {
47 NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
48 }
49 50 @end
复制代码

打印效果:

注意:系统自动将NSOperationqueue中的NSOperation对象取出,将其封装的操作放到一条新的线程中执行。上面的代码示例中,一共有四个任务,operation1和operation2分别有一个任务,operation3有两个任务。一共四个任务,开启了四条线程。通过任务执行的时间全部都是273可以看出,这些任务是并行执行的。

提示:队列的取出是有顺序的,与打印结果并不矛盾。这就好比,选手A,BC虽然起跑的顺序是先A,后B,然后C,但是到达终点的顺序却不一定是A,B在前,C在后。

下面使用for循环打印,可以更明显的看出任务是并发执行的。

代码示例:

复制代码
 1 #import "YYViewController.h"  2  3 @interface YYViewController ()
 4  5 @end  6  7 @implementation YYViewController
 8  9 - (void)viewDidLoad
10 {
11  [super viewDidLoad];
12 13 //创建NSInvocationOperation对象,封装操作 14 NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
15 NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
16 //创建对象,封装操作 17 NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
18 for (int i=0; i<5; i++) {
19 NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
20  }
21  }];
22 [operation3 addExecutionBlock:^{
23 for (int i=0; i<5; i++) {
24 NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
25  }
26  }];
27 28 //创建NSOperationQueue 29 NSOperationQueue * queue=[[NSOperationQueue alloc]init];
30 //把操作添加到队列中 31  [queue addOperation:operation1];
32  [queue addOperation:operation2];
33  [queue addOperation:operation3];
34 }
35 36 -(void)test1
37 {
38 for (int i=0; i<5; i++) {
39 NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
40  }
41 }
42 43 -(void)test2
44 {
45 for (int i=0; i<5; i++) {
46 NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
47  }
48 }
49 50 @end
复制代码
目录
相关文章
|
1月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
7天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
91 66
|
17天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
21天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
23天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
25天前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
26天前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
1月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
30 2
|
1月前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
51 9
|
1月前
|
vr&ar Android开发 iOS开发
安卓与iOS开发中的用户界面设计原则
【10月更文挑战第41天】探索移动应用开发的精髓,本文将深入分析安卓和iOS平台上用户界面设计的核心原则。通过比较两大操作系统的设计哲学,我们将揭示如何打造直观、易用且美观的应用程序界面。无论你是初学者还是资深开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,帮助你在竞争激烈的应用市场中脱颖而出。