本文主要讲如何自定义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的更多相关文章

  1. iOS多线程之8.NSOPeration的其他用法

      本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...

  2. iOS多线程之GCD小记

    iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...

  3. 多线程之pthread, NSThread, NSOperation, GCD

    关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD p ...

  4. iOS多线程之Thread

    多线程 • Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周 ...

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

    这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread.NSOperation及GCD三种方式,常用GCD及NSOperation. 1.NSThread 创建线程主要有以下三种方 ...

  6. IOS多线程之NSOperation学习总结

    NSOperation简介 1.NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 2.NSOperation和NSOperationQu ...

  7. iOS多线程之NSThread使用

    iOS中的多线程技术 我们在iOS开发项目过程中,为了解决UI界面操作不被耗时操作阻塞,我们会使用到多线程技术.在iOS开发中,我们主要会用到三种多线程操作技术:NSThread,NSOperatio ...

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

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

  9. iOS 多线程之NSOperation篇举例详解

    这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇.总篇也包含了此文的链接.本文讲解的知识点有NSBlockOperationClick,队列, ...

随机推荐

  1. 【repost】JS错误类型的学习

    SyntaxError是解析代码时发生的语法错误 // 变量名错误  var 1a;  // 缺少括号  console.log 'hello'); (2)ReferenceError Referen ...

  2. CentOS7 安装Mono及Jexus

    CentOS7安装Mono及Juxes 1 安装Mono 1.1 安装yum-utils 因为安装要用到yum-config-manager,默认是没有安装的,所以要先安装yum-utils包.命令如 ...

  3. ajax-异步JavaScript和XML

    什么是ajax? ajax是异步的javascript和XML ( Asynchronous Javascript And XML ) 优点:节省用户操作时间,提高用户体验.减少数据请求次数. 什么是 ...

  4. H3C交换机 配置IP映射

    进入cmd 输入命令:telnet 192.168.x.x(交换机IP地址) 登陆后,更换用户"sys" 输入命令:dis cur(展示当前状态) 进入后按"空格&quo ...

  5. 【SQL】关于无法附加文件的错误

    [SQL]关于无法附加文件的错误 1.错误信息如下: 2.估计是权限问题右击属性,把权限开一下 3.然后就附加成功了~~ ——————————————————————————————————————— ...

  6. .Net中的RealProxy实现AOP

    序言 这个AOP要从我们公司的一个事故说起,前段时间公司的系统突然在乌云中出现,数据被泄露的一览无余,乌云上显示是SQL注入攻击.呵,多么贴近生活的一个露洞,可谓是人尽皆知啊.然而却华丽丽的给拉我们一 ...

  7. PHP 高级编程(2/5) - 反射API

    PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 此外,反射 API 提供了方法来取出函数.类和方法中的文档注释.通过使用反射API可以分析其他的类.接口.方 ...

  8. Log4Net生成出现未引用错误解决方法

    1.步骤一: 2.步骤二: 明明添加了引用怎么还提示找不到命名空间呢.解决这个问题很简单,右键项目选择属性: 3.步骤三:换成.NET Framework 4即可,解决! 4.两个有啥区别? Micr ...

  9. Log4net入门(ASP.NET MVC 5篇)

    在前4篇Log4net入门文章中,我们讲述了log4net的一些简单用法,在这一篇中我们主要讲述如何在ASP.NET MVC 5项目中将日志信息写入SQL Server数据库中. 一.创建最简单的AS ...

  10. 11gRAC报错CRS-4535, CRS-4000解决

    环境:AIX6.1 + Oracle11.2.0.4 RAC(2 nodes) 1.故障现象 2.定位问题 3.处理问题 1.故障现象 使用crsctl查看集群各资源状态,在任一节点都会直接报错CRS ...