AJ学IOS(53)多线程网络之NSOperation简介
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简介的更多相关文章
- iOS开发多线程篇—自定义NSOperation
iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- AJ学IOS(48)多线程网络之多线程简单了解
AJ分享,必须精品 一:进程和线程 1:什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分 ...
- iOS开发多线程篇 10 —NSOperation基本操作
iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...
- iOS开发多线程篇 09 —NSOperation简单介绍
iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...
- AJ学IOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController
AJ分享,必须精品 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封 ...
- AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引
AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...
- AJ学IOS(39)UI之核心动画之CABasicAnimation(基础动画)
AJ分享,必须精品 一.CABasicAnimation简介 CAPropertyAnimation的子类 属性解析: fromValue:keyPath相应属性的初始值 toValue:keyPat ...
- AJ学IOS(54)多线程网络之NSOperation重要知识
AJ分享,必须精品 一:队列的类型与队列添加任务 1: 主队列 [NSOperationQueue mainQueue] 添加到”主队列”中的操作,都会放到主线程中执行. 2:非主队列 [[NSOpe ...
- AJ学IOS(55)多线程网络之图片下载框架之SDWebImage
AJ分享,必须精品 效果: 代码: - (NSArray *)apps { if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsO ...
随机推荐
- 「建议心心」要就来15道多线程面试题一次爽到底(1.1w字用心整理)
. 本文是给**「建议收藏」200MB大厂面试文档,整理总结2020年最强面试题库「CoreJava篇」**写的答案,所有相关文章已经收录在码云仓库:https://gitee.com/bingqil ...
- linux入门系列18--Web服务之Apache服务2
接上一篇文章,在了解Apache基本配置以及SELinux相关知识后,继续演示Apache提供的虚拟主机功能以及访问控制方式. 如果还没看上一篇的建议先查看后再来,上篇文章"linux入门系 ...
- Integration of Metabolomics and Transcriptomics To Reveal Metabolic Characteristics and Key Targets Associated with Cisplatin Resistance in Nonsmall Cell Lung Cancer(解读人:林山云)
期刊名:J. Proteome Res 发表时间:(2019年8月) IF:3.78 单位: 上海第九人民医院药学系,上海交通大学药学院 上海交通大学药物与生物化学系 物种:人源A549细胞系 技 ...
- jenkins-gitlab-harbor-ceph基于Kubernetes的CI/CD运用(一)
注:这部分的学习还是要靠自己多点点 多尝试尝试 这部分19年3月份我是玩的很溜的,一年没用,基本忘光光了. 学习要温故而知新! 流程拓扑图 前提准备 部署应用服务 部署kubernetes 集群:ht ...
- Java基础语法(2)-变量
title: Java基础语法(2)-变量 blog: CSDN data: Java学习路线及视频 1.什么是变量? 变量的概念 内存中的一个存储区域 该区域的数据可以在同一类型范围内不断变化 变量 ...
- 关于MySQL 建表的一些建议
由于在生产环境下,我们对MySQL数据库的操作通常是通过命令行进行操作,因此,建议建表的时候也手写MySQL语句(不建议用图形界面建表). 1.添加注释的格式 在编写MySQL语句时,我们通常会被要求 ...
- 使用docker构建双主mysql
我们有的时候需要双主mysql, 这样无论哪个数据库出现了问题的话都可以继续使用数据库.把两个数据库挂到一个代理上面,这样哪个服务出问题了,另外一个就可以继续服务了.当然本文不是主要谈代理的,所以这个 ...
- Hook集合----SSDTHook(x86 Win7)
最近在学习Ring0层Hook的一些知识点,很久就写完SSDTHook的代码了,但是一直没有整理成笔记,最近有时间也就整理整理. 介绍: SSDTHook 实质是利用Ntoskrnl.exe 中全局导 ...
- Linux Cgroup 入门教程:cpuset
这是 Cgroup 系列的第四篇,往期回顾: Linux Cgroup 入门教程:基本概念 Linux Cgroup 入门教程:CPU Linux Cgroup 入门教程:内存 通过上篇文章的学习,我 ...
- java——构造器理解
构造器理解 什么是构造器 构造器也叫构造方法:用于对象的初始化: 写构造器注意事项 构造器名与类名一致:有返回值但是不能定义返回类型(返回值类型是本类,可以加一个空的return): 构造器的调用 通 ...