iOS多线程之9.自定义NSOperation
本文主要讲如何自定义NSOperation,以及自定义NSOperation的一些注意事项,以下载图片为例。
新建一个类,继承于NSOperation。
CustomOperation.h
代码
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface CustomOperation : NSOperation
@property (nonatomic, copy) NSString *strURL;
@property (nonatomic, copy) void (^DownLoadImageBLock)(UIImage *image);
@end
CustomOperation.m
#import "CustomOperation.h"
@implementation CustomOperation
// 1.实现Main方法
- (void)main {
// 2.新建一个自动释放池
@autoreleasepool {
// 3.正确响应取消事件
if (self.isCancelled) return;
NSURL *url = [NSURL URLWithString:self.strURL];
NSData *data = [NSData dataWithContentsOfURL:url];
if (self.isCancelled) {
url = nil;
data = nil;
}
UIImage *image = [UIImage imageWithData:data];
if (self.isCancelled) {
image = nil;
return;
}
// 4.把图片传回主线程
dispatch_async(dispatch_get_main_queue(), ^{
//5. 用block传值
if (self.DownLoadImageBLock) {
self.DownLoadImageBLock(image);
}
});
}
}
// 6. dealloc
-(void)dealloc {
NSLog(@"operation-------dealloc");
}
分析:1.自定义NSOperation都要实现Main方法,在这个方法里写要NSOperation执行的耗时操作。
2.新建一个自动释放池。如果是异步操作,不能访问主线程的自动释放池,所以要新建一个。
3.正确响应取消事件。在每一个耗时操作之前,都要判断此操作是否被取消。如果取消了,就不往下执行了。因为我们有时候需要先取消下载,例如滑动tableView的时候,等不滑动了,再继续,增加UI流畅度。
4.把图片传回主线程。主线程回调,因为下载完的数据肯定是要操作UI的,AFNetworking就是这样干的。
5.用block传值。传值之前判断是否存在此block,这和代理传值之前判断代理是否响应了代理里的方法是一个道理。
6.dealloc方法,监测一下有没有正确释放内存。
使用自定义NSOperation
代码
// 点击屏幕下载图片
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 1.创建一个CustomOperation对象
CustomOperation *operation1 = [[CustomOperation alloc] init];
// 2.为URL赋值
operation1.strURL = @"http://h.hiphotos.baidu.com/zhidao/pic/item/6d81800a19d8bc3ed69473cb848ba61ea8d34516.jpg";
// 3.处理block传回来的结果
operation1.DownLoadImageBLock = ^(UIImage *image) {
self.imageView1.image = image;
};
// 4.创建一个CustomOperation对象
CustomOperation *operation2 = [[CustomOperation alloc] init];
operation2.strURL = @"http://h.hiphotos.baidu.com/zhidao/pic/item/0eb30f2442a7d9334f268ca9a84bd11372f00159.jpg";
operation2.DownLoadImageBLock = ^(UIImage *image) {
self.imageView2.image = image;
};
// 5.创建一个队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 6.把操作放入队列中
[queue addOperation:operation1];
[queue addOperation:operation2];
}
效果

分析1. 这一步和使用系统提供的NSOperation没有区别。
2.为自定义的NSOperation提供下载地址。
3.处理下载之后的数据。由于在自定义的NSOperation中已经是主线程回调了,所以就可以直接操作UI了。
4.同上。
5.创建一个队列。
6..把操作放入队列中。
自定义一个NSOperation就是这么简单,我们只要重写main方法就可以,传值的方式有多种,如果大家不习惯block,也可以用代理,都能达到效果。但是block的可读性更高,因为代码都写在一起,好找。稍后我会向git上传一个项目,是列表页下载图片,用自定义NSOperation写的,有兴趣的可以看看。
iOS多线程之9.自定义NSOperation的更多相关文章
- iOS多线程之8.NSOPeration的其他用法
本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...
- iOS多线程之GCD小记
iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...
- 多线程之pthread, NSThread, NSOperation, GCD
关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD p ...
- iOS多线程之Thread
多线程 • Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周 ...
- iOS开发笔记5:多线程之NSThread、NSOperation及GCD
这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread.NSOperation及GCD三种方式,常用GCD及NSOperation. 1.NSThread 创建线程主要有以下三种方 ...
- IOS多线程之NSOperation学习总结
NSOperation简介 1.NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 2.NSOperation和NSOperationQu ...
- iOS多线程之NSThread使用
iOS中的多线程技术 我们在iOS开发项目过程中,为了解决UI界面操作不被耗时操作阻塞,我们会使用到多线程技术.在iOS开发中,我们主要会用到三种多线程操作技术:NSThread,NSOperatio ...
- iOS开发多线程篇 11 —自定义NSOperation
iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS 多线程之NSOperation篇举例详解
这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇.总篇也包含了此文的链接.本文讲解的知识点有NSBlockOperationClick,队列, ...
随机推荐
- Jexus 服务器部署导航
说明:本索引只是方便本人查找,不涉及版权问题,所有博客,还是到元博客地址访问. <script async src="//pagead2.googlesyndication.com/p ...
- Dubbo 备注
Dubbo是阿里开源的一款服务治理中间件,主要包含如下节点: Provider: 暴露服务的服务提供方. Consumer: 调用远程服务的服务消费方. Registry: 服务注册与发现的注册中心. ...
- SurfaceView 绘制分形图
之前一直做的是应用类,这次抽时间,参考网上资料实践了下SurfaceView.目标是在页面上画一个科赫曲线的分形图. 代码如下: package com.example.fredric.demo02; ...
- 详解前端模块化工具-webpack
webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不在,这时,使日渐增多的js代码变得合 ...
- WEB 基础知识(一)
1. 系统架构 1.1 B/S系统架构 1.2 C/S系统架构 1.3 对比与区别 1.3.1 概述 C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过 ...
- 在面试中忽然发现DateTime的一些...
今天说说我面试中碰到的一个小问题,在我问起DateTime为什么无法赋值NULL值,一般第一反应都认为它是值类型,不是引用类型,但随后我查阅了度娘自我学习到它是结构类型,那么随之而然就无法赋值NULL ...
- MVC中的AOP
一. AOP是什么? AOP(Aspect-Oriented Programming),面向切面编程,看着是跟OOP(面向对象编程)挺相近的,但实际上又有什么区别呢?OOP具有封装,继承,多态等东西来 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(25)-权限管理系统-系统管理员(附生成器)
系列目录 这一节我们要着手建立系统管理员表,但发布之前,我先发布一个代码生成器给大家先用着. 这个生成器是为这个项目而生的,理论不能用于其他项目,而且写得比较潦草,但能用 下载地址 有兴趣要生成器源码 ...
- Bootstrap框架的学习(二)
一.下载Bootstrap Bootstrap (当前版本 v3.3.0)提供以下几种方式帮你快速上手,每一种方式针对具有不同技能等级的开发者和不同的使用场景. 下载地址:http://v3.boot ...
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...