ios开发多线程一:了解-NSOperation的基本使用

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self blockOperation];
}

/**
 *    1:NSOperation封装任务的两种方式:NSInvocationOperation,NSBlockOperation,其中两种方法若没指定队列,则默认是在主队列里去执行
 2:住家任务:addExecutionBlock:
 注意:如果一个操作中的任务数量大于1,那么会开子线程并发执行任务

 注意:不一定是子线程,有可能是主线程
 */

-(void)invocationOpeation
{

    //1.创建操作,封装任务
    /*
     第一个参数:目标对象 self
     第二个参数:调用方法的名称
     第三个参数:前面方法需要接受的参数 nil
     */
     NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download1) object:nil];
     NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download2) object:nil];
     NSInvocationOperation *op3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download3) object:nil];

    //2.启动|执行操作
     [op1 start];
     [op2 start];
     [op3 start];
}

-(void)blockOperation
{
    //1.创建操作
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"1----%@",[NSThread currentThread]);
    }];

    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"2----%@",[NSThread currentThread]);
    }];

    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"3----%@",[NSThread currentThread]);
    }];

    //追加任务
    //注意:如果一个操作中的任务数量大于1,那么会开子线程并发执行任务
    //注意:不一定是子线程,有可能是主线程
    [op3 addExecutionBlock:^{
        NSLog(@"4---%@",[NSThread currentThread]);
    }];

    [op3 addExecutionBlock:^{
        NSLog(@"5---%@",[NSThread currentThread]);
    }];

    [op3 addExecutionBlock:^{
        NSLog(@"6---%@",[NSThread currentThread]);
    }];

    //2.启动
    [op1 start];
    [op2 start];
    [op3 start];
}

-(void)download1
{
    NSLog(@"%s----%@",__func__,[NSThread currentThread]);
}

-(void)download2
{
    NSLog(@"%s----%@",__func__,[NSThread currentThread]);
}

-(void)download3
{
    NSLog(@"%s----%@",__func__,[NSThread currentThread]);
}

@end

###2.NSOperation

- 2.1 NSOperation基本使用

(1)相关概念

01 NSOperation是对GCD的包装

02 两个核心概念【队列+操作】

(2)基本使用

01 NSOperation本身是抽象类,只能只有它的子类

02 三个子类分别是:NSBlockOperation、NSInvocationOperation以及自定义继承自NSOperation的类

03 NSOperation和NSOperationQueue结合使用实现多线程并发

(3)相关代码

```objc

//  01 NSInvocationOperation

//1.封装操作

/*

第一个参数:目标对象

第二个参数:该操作要调用的方法,最多接受一个参数

第三个参数:调用方法传递的参数,如果方法不接受参数,那么该值传nil

*/

NSInvocationOperation *operation = [[NSInvocationOperation alloc]

initWithTarget:self selector:@selector(run) object:nil];

//2.启动操作

[operation start];

-------------------------------------------------

//  02 NSBlockOperation

//1.封装操作

/*

NSBlockOperation提供了一个类方法,在该类方法中封装操作

*/

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

//在主线程中执行

NSLog(@"---download1--%@",[NSThread currentThread]);

}];

//2.追加操作,追加的操作在子线程中执行

[operation addExecutionBlock:^{

NSLog(@"---download2--%@",[NSThread currentThread]);

}];

[operation addExecutionBlock:^{

NSLog(@"---download3--%@",[NSThread currentThread]);

}];

//3.启动执行操作

[operation start];

----------------------------------------------

// 03 自定义NSOperation

//如何封装操作?

//自定义的NSOperation,通过重写内部的main方法实现封装操作

-(void)main

{

NSLog(@"--main--%@",[NSThread currentThread]);

}

//如何使用?

//1.实例化一个自定义操作对象

XMGOperation *op = [[XMGOperation alloc]init];

//2.执行操作

[op start];

```

时间: 2024-08-07 16:59:04

ios开发多线程一:了解-NSOperation的基本使用的相关文章

记Booking.com iOS开发岗位线上笔试

今晚参加了Booking的iOS职位线上笔试,结束后方能简单归纳一下. 关于测试内容: Booking采用了HackerRank作为测试平台,测试总时长为75分钟,总计4道题. 测试之前我很紧张,因为根据之前参加微软的Online Test经验来看,应该会有一些复杂的算法题.但是事实上Booking测试的题目,前三题均没有涉及高深的算法,都是一些基础的Objective-C和iOS开发的知识,这反而带了更大的困惑,想的太多反而浪费了大量时间. 测试邀请邮件 最后的结果是完成了3/4,因为时间没了

iOS开发多线程篇 11 —自定义NSOperation

iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // 2 // YYViewController.h 3 // 01-自定义Operation 4 // 5 // Created by apple on 14-6-26. 6 // Copyright (c) 2014年 itcase. All rig

iOS开发多线程之NSOperation NSOperationQueue

- (void)viewDidLoad { [super viewDidLoad]; /* NSOperation和NSOperationQueue实现多线程编程 步骤:将执行的操作封装到NSOperation对象中 将NSOperation对象添加到NSOperationQueue中 系统将NSOperation对象取出来 将封装的操作放到一条新线程执行 NSOperation的子类: NSInvocationOperation 封装 initWithTarget:selector:objec

iOS开发-多线程之GCD(Grand Central Dispatch)

Grand Central Dispatch(GCD)是一个强有力的方式取执行多线程任务,不管你在回调的时候是异步或者同步的,可以优化应用程序支持多核心处理器和其他的对称多处理系统的系统.开发使用的过程中只需要将执行的任务并添加到到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务.Dispatch Queue更简单而且在实现符合需求的多线程任务时更有效率.Dispatch  Queue一般来说有三种方式,如下图: Serial执行的时候的先进先出,Concurrent

iOS开发多线程篇—基础知识 NSOperation

原文  http://www.cnblogs.com/dyf520/p/3807187.html -------NSOperation简介---- 1.NSOperation的作用 ·配合使用NSOperation和NSOperationQueue也能实现多线程编程 2.NSOperation和NSOperationQueue实现多线程的具体步骤 ·先将需要执行的操作封装到一个NSOperation对象中 ·然后将NSOperation对象添加到NSOperationQueue中 ·系统会自动将

iOS开发多线程之GCD

- (void)viewDidLoad { [super viewDidLoad]; /*GCD:Grand Central Dispatch 牛逼的中枢调度器,自动管理线程的生命周期(创建 调度 销毁).将任务存放到队列中,GCD会自动将队列中的任务取出,先进先出,放到线程中执行. 同步执行任务:在当前线程中执行 dispatch_sync(dispatch_queue_t queue,dispatch_block_t block) 异步执行任务:在其他线程执行 dispatch_async(

iOS开发之多线程技术——NSOperation篇

本篇将从四个方面对iOS开发中使用到的NSOperation技术进行讲解: 一.什么是NSOperation 二.我们为什么使用NSOperation 三.在实际开发中如何使用NSOperation 1.自定义NSOperation 2.NSOperation的基本使用 3.NSOperation实现线程间通信 1)利用代理进行消息传递 2)利用通知实现消息传递 3)利用block进行消息传递 四.与GCD比较 一.什么是NSOperation NSOperation是一个抽象的基类,表示一个独

iOS开发笔记5:多线程之NSThread、NSOperation及GCD

这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread.NSOperation及GCD三种方式,常用GCD及NSOperation. 1.NSThread 创建线程主要有以下三种方式 需要注意的是对于多个线程可能同时访问一个对象的时候,使用“@synchronized”来解决这类线程同步问题. 在子线程中通知主线程通常使用以下两种办法: 2.NSOperation NSOperation有三种使用方式,分别是NSInvocationOperation.NSBlockOpera

聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)-b

如果说一个项目出现的最重大的事故,那无疑就是开发人员使用了不可控的元素. 前言 iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博客写的就是关于耳机的一些开发相关的技术点. 检测耳机是否插入 看到上面的标题的时候一定要注意,这里说的是"检测耳机是否插入",这里只是一次性的检测,不是实时监控耳机的拔插,但是有一些时候,下面的这个方法已经足够满足我们的开发需求了. 首先,我们需要导入AVFoundation.framew