AJ分享,必须精品

一:简单介绍

1:NSOperation的作⽤使用步骤:

配合使用NSOperation和NSOperationQueue也能实现多线程编程。

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

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

NSOperationQueue的作用:
NSOperation可以调用start方法来执行任务,但默认是同步执行的如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作。

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

//这里是两个子类的方法后面详细介绍
- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block;

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

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

2.NSOperation的子类

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

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

(1)NSInvocationOperation

(2)NSBlockOperation

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

NSOperation的三种用法(子类)

1:NSInvocationOperation

最简单的用法(在主线程中:)

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{ // 1.创建1个操作
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download) object:nil]; // 2.开启操作
[operation start];
} -(void)download
{
NSLog(@"download---%@", [NSThread currentThread]);
}

异步的方法(记住这个)

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.创建一个队列(非主队列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 2.创建1个操作
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download) object:nil]; // 3 .将操作添加到队列(非主队列)————这一步内部相当于开启
[queue addOperation:operation]; } -(void)download
{
NSLog(@"download---%@", [NSThread currentThread]);
}

效果:线程3(其中系统会自动给我们分配最合适的线程)

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


2:NSBlockOperation

第二种也很简单:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.创建一个队列(非主队列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 2.创建1个操作
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"download---%@", [NSThread currentThread]);
}]; // 3 .将操作添加到队列(非主队列)————这一步内部相当于开启
[queue addOperation:operation]; }

效果:

这里还有中写法是直接将block添加到queue中

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.创建一个队列(非主队列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 2.将操作添加到队列(非主队列)————这一步内部相当于开启
[queue addOperationWithBlock:^{
NSLog(@"download---%@", [NSThread currentThread]);
}]; }

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

这个也不难,就是自定义一个NSOperation的子类,实现他的main方法

自定义类的写法

//
// NYOperation.m
// NSOperation使用
//
// Created by apple on 15-5-27.
// Copyright (c) 2015年 znycat. All rights reserved.
// #import "NYOperation.h" @implementation NYOperation -(void)main
{
NSLog(@"download---%@", [NSThread currentThread]);
} @end

controller调用写法

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.创建一个队列(非主队列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 2.创建1个操作
NYOperation *operation = [[NYOperation alloc]init]; // 3 .将操作添加到队列(非主队列)————这一步内部相当于开启
[queue addOperation:operation]; }

结果:


AJ学IOS(53)多线程网络之NSOperation简介的更多相关文章

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

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  2. AJ学IOS(48)多线程网络之多线程简单了解

    AJ分享,必须精品 一:进程和线程 1:什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分 ...

  3. iOS开发多线程篇 10 —NSOperation基本操作

    iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...

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

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  5. AJ学IOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController

    AJ分享,必须精品 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封 ...

  6. AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引

    AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...

  7. AJ学IOS(39)UI之核心动画之CABasicAnimation(基础动画)

    AJ分享,必须精品 一.CABasicAnimation简介 CAPropertyAnimation的子类 属性解析: fromValue:keyPath相应属性的初始值 toValue:keyPat ...

  8. AJ学IOS(54)多线程网络之NSOperation重要知识

    AJ分享,必须精品 一:队列的类型与队列添加任务 1: 主队列 [NSOperationQueue mainQueue] 添加到”主队列”中的操作,都会放到主线程中执行. 2:非主队列 [[NSOpe ...

  9. AJ学IOS(55)多线程网络之图片下载框架之SDWebImage

    AJ分享,必须精品 效果: 代码: - (NSArray *)apps { if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsO ...

随机推荐

  1. 使用new Image()可以针对单单请求,不要返回数据的情况

    使用new Image()可以针对单单请求,不要返回数据的情况,比如我这里写了一个Demo,请求百度的Logo一个示例: <html> <head> </head> ...

  2. 学习笔记----C语言的面向对象

    2020-03-26    21:27:17 面向对象的编程语言都有一个类的概念,像Java.python等.类是对特定数据的特定操作的集合体.它包含两个范畴:数据和操作.C语言是没有类的概念的,但是 ...

  3. 机器学习 - 命名实体识别之Hidden Markov Modelling

    概述 命名实体识别在NLP的应用中也是非常广泛的,尤其是是information extraction的领域.Named Entity Recognition(NER) 的应用中,最常用的一种算法模型 ...

  4. Github桌面版使用方式(MAC)

    Github是一个流行的代码管理网站,同时也是全球最大的同性交友网站(滑稽).Github网页上你可以自由地托管自己的项目,也可以fork别人的项目过来玩耍,非常之方便,今天笔者就来介绍一下githu ...

  5. Building Applications with Force.com and VisualForce(Dev401)(十二):Implementing Business Processes:Automating Business Processes Part 1

    ev401-013:Implementing Business Processes:Automating Business Processes Part 1 Module Objectives1.Li ...

  6. 从零开始实现穿衣图像分割完整教程(附python代码演练)

    时装业是人工智能领域很有前景的领域.研究人员可以开发具有一定实用价值的应用.我已经在这里展示了我对这个领域的兴趣,在那里我开发了一个来自Zalando在线商店的推荐和标记服装的解决方案. 在这篇文章中 ...

  7. 使用Python+OpenCV进行图像处理(二)| 视觉入门

    [前言]图像预处理对于整个图像处理任务来讲特别重要.如果我们没有进行恰当的预处理,无论我们有多么好的数据也很难得到理想的结果. 本篇是视觉入门系列教程的第二篇.整个视觉入门系列内容如下: 理解颜色模型 ...

  8. Feign客户端实现RPC 调用

    1,springcloud 中支持http调用的两种方式,RestTemplate,Feign客户端 2,Feign 客户端是一个声明式(注解方式)http 远程调用工具 3,实现方式如下: 第一步: ...

  9. Thread wait notify sleep

    wait: 必须暂定当前正在执行的线程,并释放资源锁,让其他线程可以有机会运行 notify/notifyall: 唤醒因锁池中的线程,使之运行 wait与sleep区别 对于sleep()方法,我们 ...

  10. linux service 例子

    在 /etc/init.d/ 中创建新文件 #/bin/sh # 检查第一个参数是什么来执行对应动作 case $1 in start) /usr/local/php/bin/php-cgi -b 1 ...