#import <Foundation/Foundation.h>

typedef  void (^DownloadCompletionBlock)(UIImage *image);

@interface DownloadOperation : NSOperation
// 图片的url地址
@property (nonatomic, copy) NSString *url;
// retain对block没有作用,只能用copy
@property (nonatomic, copy) DownloadCompletionBlock downloadCompletionBlock;
@end ============================ #import "DownloadOperation.h" @implementation DownloadOperation #pragma mark 在这里添加想要执行的操作
- (void)main {
// main方法可能在异步线程调用,这样就不恩能够访问主线程的自动释放池
// 因此,在这里新建一个属于当前线程的自动释放池
@autoreleasepool {
// 取消操作发生在任何时刻都有可能,因此在执行任何操作之前,先检测该操作是否已经被取消
if (self.isCancelled) {
return;
} NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.url]];
// 执行了比较耗时的操作后也需要检测该操作是否已经被取消
if (self.isCancelled) {
return;
} // 调用Block,传递图片出去
if (_downloadCompletionBlock) {
UIImage *image = [UIImage imageWithData:data]; dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
_downloadCompletionBlock(image);
});
}
}
} - (void)dealloc {
[_url release];
[_downloadCompletionBlock release];
[super dealloc];
}
@end
#import "DownloadOperation.h"

@implementation DownloadOperation

#pragma mark 在这里添加想要执行的操作
- (void)main {
// main方法可能在异步线程调用,这样就不恩能够访问主线程的自动释放池
// 因此,在这里新建一个属于当前线程的自动释放池
@autoreleasepool {
// 取消操作发生在任何时刻都有可能,因此在执行任何操作之前,先检测该操作是否已经被取消
if (self.isCancelled) {
return;
} NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.url]];
// 执行了比较耗时的操作后也需要检测该操作是否已经被取消
if (self.isCancelled) {
return;
} // 调用Block,传递图片出去
if (_downloadCompletionBlock) {
UIImage *image = [UIImage imageWithData:data]; dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
_downloadCompletionBlock(image);
});
}
}
} - (void)dealloc {
[_url release];
[_downloadCompletionBlock release];
[super dealloc];
}
@end
========================================= #import "DownloadOperation.h" @implementation DownloadOperation #pragma mark 在这里添加想要执行的操作
- (void)main {
// main方法可能在异步线程调用,这样就不恩能够访问主线程的自动释放池
// 因此,在这里新建一个属于当前线程的自动释放池
@autoreleasepool {
// 取消操作发生在任何时刻都有可能,因此在执行任何操作之前,先检测该操作是否已经被取消
if (self.isCancelled) {
return;
} NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.url]];
// 执行了比较耗时的操作后也需要检测该操作是否已经被取消
if (self.isCancelled) {
return;
} // 调用Block,传递图片出去
if (_downloadCompletionBlock) {
UIImage *image = [UIImage imageWithData:data]; dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
_downloadCompletionBlock(image);
});
}
}
} - (void)dealloc {
[_url release];
[_downloadCompletionBlock release];
[super dealloc];
}
@end
#import "DownloadOperation.h"

@implementation DownloadOperation

#pragma mark 在这里添加想要执行的操作
- (void)main {
// main方法可能在异步线程调用,这样就不恩能够访问主线程的自动释放池
// 因此,在这里新建一个属于当前线程的自动释放池
@autoreleasepool {
// 取消操作发生在任何时刻都有可能,因此在执行任何操作之前,先检测该操作是否已经被取消
if (self.isCancelled) {
return;
} NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.url]];
// 执行了比较耗时的操作后也需要检测该操作是否已经被取消
if (self.isCancelled) {
return;
} // 调用Block,传递图片出去
if (_downloadCompletionBlock) {
UIImage *image = [UIImage imageWithData:data]; dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
_downloadCompletionBlock(image);
});
}
}
} - (void)dealloc {
[_url release];
[_downloadCompletionBlock release];
[super dealloc];
}
@end
========================================= #import "DownloadOperation.h" @implementation DownloadOperation #pragma mark 在这里添加想要执行的操作
- (void)main {
// main方法可能在异步线程调用,这样就不恩能够访问主线程的自动释放池
// 因此,在这里新建一个属于当前线程的自动释放池
@autoreleasepool {
// 取消操作发生在任何时刻都有可能,因此在执行任何操作之前,先检测该操作是否已经被取消
if (self.isCancelled) {
return;
} NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.url]];
// 执行了比较耗时的操作后也需要检测该操作是否已经被取消
if (self.isCancelled) {
return;
} // 调用Block,传递图片出去
if (_downloadCompletionBlock) {
UIImage *image = [UIImage imageWithData:data]; dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
_downloadCompletionBlock(image);
});
}
}
} - (void)dealloc {
[_url release];
[_downloadCompletionBlock release];
[super dealloc];
}
@end

自定义nsoperation的用法的更多相关文章

  1. iOS多线程之9.自定义NSOperation

      本文主要讲如何自定义NSOperation,以及自定义NSOperation的一些注意事项,以下载图片为例. 新建一个类,继承于NSOperation. CustomOperation.h 代码 ...

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

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

  3. iOS开发——多线程OC篇&(十一)多线程NSOperation高级用法

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

  4. 自定义NSOperation

    一直在思考,每次异步请求都会创建一个新线程,如果我同时发100个异步请求,这样会导致我的内存爆满,应用程序奔溃,因为iOS对开线程有着约束,不能开很多个线程,这就要求我们必须对异步请求进行控制,我一直 ...

  5. Vue.js自定义指令的用法与实例

    市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vu ...

  6. Objective-c 多线程操作 自定义NSOperation 模拟下载

    写在前面 使用多线程下载图片,使用内存缓存和磁盘缓存. 这里只为理解NSOperation及其派生类 真要应用到APP中 请下载成熟的第三方库 效果 下载多张图片时可控制线程并发数 分析 自定义NSO ...

  7. 自定义NSOperation下载图片

    自定义NSOperation的话,只是需要将要下载图片的操作下载它的main方法里面,考虑到,图片下载完毕,需要回传到控制器里,这里可以采用block,也可以采用代理的方式实现,我采用的是代理的方式实 ...

  8. iOS多线程编程之自定义NSOperation(转载)

    一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // ...

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

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

随机推荐

  1. ORM数据库框架 greenDAO SQLite MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. android 框架层 常用类介绍

    名称 功能描述 示意图 activitymanager 管理应用程序的周期并提供常用的回退功能 window manager 窗口管理者 content provider 用于访问另一个的数据,或者共 ...

  3. 【Scala】Scala-循环与遍历

    Scala-循环与遍历 scala for 1000_百度搜索 Scala 2.8的for表达式:性能与运行顺序的改进 - 51CTO.COM scala List集合的用法 - CSDN博客

  4. 转:EM算法总结

    https://applenob.github.io/em.html EM算法总结 在概率模型中,最常用的模型参数估计方法应该就是最大似然法. EM算法本质上也是最大似然,它是针对模型中存在隐变量的情 ...

  5. 成为Linux内核高手的四个方法

    首页 最新文章 资讯 程序员 设计 IT技术 创业 在国外 营销 趣文 特别分享 更多 > - Navigation -首页最新文章资讯程序员设计IT技术- Java & Android ...

  6. 上机题目(0基础)- Java网络操作-打印网页(Java)

    打印一个网页,熟悉Java网络编程: import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  7. nod32的内网在线更新设置

    需要一个iis地址,最好能够目录浏览,权限够大. 还必须: 增加一个MIME类型,.ver,类型填写application/x-ver

  8. [Algorithm] How many times is a sorted array rotated?

    Given a sorted array, for example: // [2,5,6,8,11,12,15,18] Then we rotated it 1 time, it becomes: / ...

  9. easyui datagrid实现拖动表头

    $.extend($.fn.datagrid.methods, { columnMoving: function (jq) { return jq.each(function () { var tar ...

  10. selenium之 chromedriver与chrome版本映射表(更新至v2.38)

    https://blog.csdn.net/huilan_same/article/details/51896672 看到网上基本没有最新的chromedriver与chrome的对应关系表,便兴起整 ...