#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. DevExpress的安装方法与破解教程【转】

    DevExpress是一个界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.DevExpress开发的控件有很强的实力,不仅功能丰富,应用简单,而且界面华丽,更可方便订制,对于编程人员来 ...

  2. SharePoint 2013 开启访问请求 链接丢失

    关于SharePoint 2013 开启访问请求的做法其实很简单,比如http://www.cnblogs.com/jianyus/archive/2014/06/21/3799386.html 这篇 ...

  3. vim的查找与替换

    http://harttle.land/2016/08/08/vim-search-in-file.html

  4. (转)AssetBundle系列——共享资源打包/依赖资源打包

    有人在之前的博客中问我有关共享资源打包的代码,其实这一块很简单,就两个函数: BuildPipeline.PushAssetDependencies():依赖资源压栈: BuildPipeline.P ...

  5. Windows系统内存分析工具的介绍

      Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任 ...

  6. SharePoint中Rating相关的字段。

      From: https://sharepoint.stackexchange.com/questions/194197/how-to-manipulate-likeby-nooflikes-rat ...

  7. PDO 增删改查封装的类

    Selecting Data 你在mysql_*中是这样做的 <?php $result = mysql_query('SELECT * from table') or die(mysql_er ...

  8. 2017年11月8日最新仿互站导航t5友价商城-9套模板首页都增加微信登陆

    今天测试效果如下,直接看图吧,入口在下方,点击图片直达 把9套餐模板都添加了微信首页登陆,仿互站的导航,操作比互站还要方便,官方一直对https 支持不太友好,索性把所有的https bug都修复了, ...

  9. 【Python】使用hashlib进行MD5和sha1摘要计算

    代码: import hashlib hash = hashlib.md5() hash.update('http://www.cnblogs.com/xiandedanteng'.encode('u ...

  10. python网络爬虫 - 如何伪装逃过反爬虫程序

    有的时候,我们本来写得好好的爬虫代码,之前还运行得Ok, 一下子突然报错了. 报错信息如下: Http 800 Internal internet error 这是因为你的对象网站设置了反爬虫程序,如 ...