iOS多线程编程之二——NSOperation与NSOperationQueue(一)

简介: iOS多线程编程之二——NSOperation与NSOperationQueue

iOS多线程编程之二——NSOperation与NSOperationQueue


一、NSOperation解析


NSOperation是基于Objective-C封装的一套管理与执行线程操作的类。这个类是一个抽象类,通常情况下,我们会使用NSInvocationOperation和NSBlockOperation这两个子类进行多线程的开发,当然我们也可以写继承于NSOperation的类,封装我们自己的操作类。


1、NSOperation抽象类中提供的逻辑方法


操作开始执行


- (void)start;


在子类中可以重写这个方法,实现执行的方法


- (void)main;


取消执行


- (void)cancel;


获取当操作状态的几个属性


@property (readonly, getter=isCancelled) BOOL cancelled;//当前操作是否取消执行

@property (readonly, getter=isExecuting) BOOL executing;//当前操作是否正在执行

@property (readonly, getter=isFinished) BOOL finished;//当前操作是否执行结束

@property (readonly, getter=isAsynchronous) BOOL asynchronous;//当前操作是否在异步线程中

@property (readonly, getter=isReady) BOOL ready;//当前操作是否已经准备好


阻塞当前线程直到操作完成


- (void)waitUntilFinished;


设置在操作队列中的优先级


@property NSOperationQueuePriority queuePriority;

其中NSOperationQueuePriority的枚举如下:


typedef NS_ENUM(NSInteger, NSOperationQueuePriority) {

   NSOperationQueuePriorityVeryLow = -8L,//优先级很低

   NSOperationQueuePriorityLow = -4L,//优先级低

   NSOperationQueuePriorityNormal = 0,//优先级普通

   NSOperationQueuePriorityHigh = 4,//优先级高

   NSOperationQueuePriorityVeryHigh = 8//优先级非常高

};


设置操作完成后的回调block


@property (copy) void (^completionBlock)(void);


设置操作的优先级


@property double threadPriority;


设置操作的名称


@property (copy) NSString *name;

2、带block的操作类实例——NSBlockOperation


NSBlockOperation是NSOperation的一个子类,其可以异步的执行多个block,当所有的block都完成时,这个操作才算完成。


初始化方法:


+ (instancetype)blockOperationWithBlock:(void (^)(void))block;


在操作中添加block


- (void)addExecutionBlock:(void (^)(void))block;


添加进去的block的数组


@property (readonly, copy) NSArray *executionBlocks;

示例如下:


NSBlockOperation * opera = [NSBlockOperation blockOperationWithBlock:^{

       for (int i=0; i<10; i++) {

           NSLog(@"%@=%d",[NSThread currentThread],i);

       }

   }];

   [opera addExecutionBlock:^{

       for (int i=0; i<10; i++) {

           NSLog(@"%@=%d",[NSThread currentThread],i);

       }

   }];

   [opera start];

打印情况如下,可以看出,两个block块的执行是异步的:




3、使用NSInvocationOperation调用方法


根据选择器创建一个对象


- (instancetype)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;


通过Invocation创建一个对象


- (instancetype)initWithInvocation:(NSInvocation *)inv;


这个类执行的操作是与调用它的线程同步的,示例如下:


- (void)viewDidLoad {

   [super viewDidLoad];

   // Do any additional setup after loading the view, typically from a nib.  

   NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(log) object:nil];

   [operation start];

       for (int i=0; i<10; i++) {

       NSLog(@"%@=%d",[NSThread currentThread],i);

       }  

}



-(void)log{

   for (int i=0; i<100; i++) {

       NSLog(@"%@=%d",[NSThread currentThread],i);

   }

}

通过打印结果可以看出其执行的同步性。

目录
相关文章
|
12天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
10天前
|
缓存 Java 调度
多线程编程核心:上下文切换深度解析
在现代计算机系统中,多线程编程已成为提高程序性能和响应速度的关键技术。然而,多线程编程中一个不可避免的概念就是上下文切换(Context Switching)。本文将深入探讨上下文切换的概念、原因、影响以及优化策略,帮助你在工作和学习中深入理解这一技术干货。
30 10
|
10天前
|
算法 调度 开发者
多线程编程核心:上下文切换深度解析
在多线程编程中,上下文切换是一个至关重要的概念,它直接影响到程序的性能和响应速度。本文将深入探讨上下文切换的含义、原因、影响以及如何优化,帮助你在工作和学习中更好地理解和应用多线程技术。
19 4
|
10天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
15天前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
|
14天前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
19天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
25天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
51 1
C++ 多线程之初识多线程
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
23 3