文档章节

Objective-C-NSOperation自定义实现

BKF_
 BKF_
发布于 2016/03/03 15:02
字数 193
阅读 47
收藏 0

自定义 NSOperation要实现main方法,内部代码加上 autoRelease


DownloadImg.h

@class UIImage;
@class DownLoadOperation;

@protocol DownLoadOperationDelegate <NSObject>
@required
- (void) downloadOperation:(DownLoadOperation*) opertaion finishDownloadImg:(UIImage *)img;
@end

@interface DownLoadOperation : NSOperation
/** 要传递到operation中的属性*/
@property (nonatomic, strong) NSString *urlStr;
/** 用来通知下载图片生成KO*/
@property (nonatomic, weak) id<DownLoadOperationDelegate> delegate;
@end

DownloadImg.m

#import <UIKit/UIKit.h>

@implementation DownLoadOperation

- (void) main
{
    @autoreleasepool {
        if (self.isCancelled) {
            return;
        }
        NSURL *url = [NSURL URLWithString:self.urlStr];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *img = [UIImage imageWithData:data];
        
        if (self.isCancelled) {
            return;
        }
        //update UI
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            if ([self.delegate respondsToSelector:@selector(downloadOperation:finishDownloadImg:)]) {
                [_delegate downloadOperation:self finishDownloadImg:img];
            }
        }];
    }
}
@end

ViewController

#import "DownLoadOperation.h"

@interface ViewController ()<DownLoadOperationDelegate>

@property (weak, nonatomic) IBOutlet UIImageView *imgView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    if (_imgView.image) {
        return;
    }
    DownLoadOperation *operation = [[DownLoadOperation alloc] init];
    operation.urlStr = @"http://img4.duitang.com/uploads/item/201406/01/20140601231235_WRKGW.jpeg";
    operation.delegate = self;
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation];
}

- (void)downloadOperation:(DownLoadOperation *)opertaion finishDownloadImg:(UIImage *)img
{
    _imgView.image = img;
}
@end


© 著作权归作者所有

共有 人打赏支持
BKF_
粉丝 1
博文 21
码字总数 4291
作品 0
广州
私信 提问
iOS GCD~performSelector、dispatch_once、NSOperation总结

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、使用GCD 替代 performSelector 系列方法 NSObject 的 performSelector 系列方法有很多限制。传给要执行的方法的参数的数量是有限制的,也没...

石虎132
2017/12/05
0
0
Objective-C-NSOperation

NSOpseration是抽象基类,所以要用子类实现它的方法。(内部使用gcd实现) 1.一个NSOperation 就代表一个任务,任务的代码分装在block里或者函数里。 OC提供子类: NSInvocztionOperation:任...

BKF_
2016/03/03
2
0
iOS OS X 和 iOS 中的多线程技术-1

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、概念 多线程的目的是,通过并发执行提高 CPU 的使用效率,进而提供程序运行效率。 OS X 和 iOS 是多线程操作系统,它们追随 UNIX 系统使用...

石虎132
2017/11/21
0
0
关于iOS多线程

关于iOS多线程 原文地址:http://www.jianshu.com/p/0b0d9b1f1f19 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实...

法斗斗
2016/03/10
15
0
【iOS】多线程NSOperation

NSOperation是苹果封装的一套多线程的东西,不像GCD是纯C语言的,这个是OC的。但相比较之下GCD会更快一些,但本质上NSOPeration是多GDC的封装。 一、NSOperation与GCD的比较 GCD是基于c的底层...

xn4545945
2014/07/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Chrome浏览器中启动deviceready事件(尝试调试phonegap项目)?

我正在开发PhoneGap应用程序,我希望能够在Chrome中调试它,而不是在电话上调试。但是,我在onGetReady()函数中初始化我的代码,该函数在PhoneGap触发“deviceready”事件时触发。由于Chr...

kisshua
28分钟前
3
0
支付宝客户端架构分析:自动化日志收集及分析

摘要: 《支付宝客户端架构解析》系列将从支付宝客户端的架构设计方案入手,带领大家进一步了解支付宝在客户端架构上的迭代与优化历程。 小蚂蚁说: 《支付宝客户端架构解析》系列将从支付宝...

阿里云官方博客
31分钟前
1
0
nginx中部署vue打包后的静态文件

如何在nginx中部署静态资源就不描述了, 请看我的这篇博客 将vue脚手架项目打包后的静态文件放到nginx上, 发现有个问题, 即url上有#, 怎么去掉这个#呢. 1 项目中router的mode 路由的mode要为h...

克虏伯
49分钟前
8
0
JS容易理解错误的地方

在这端代码执行的末尾,你会不会hi变量回事函数中的hi了?你会不会认为这不是按引用传递了? 对值传递和引用传递产生质疑了? 1 var hi = {};2 function sayHello(hi) { ...

器石_
50分钟前
5
0
Java开发学习--MongoDB

之前只学过sql,第一次使用非关系型数据库。以前对于关系型数据库与非关系型数据库的概念很模糊,通过这次的学习对这两者有了一个清晰的概念。 主键 在MongoDB中,主键名叫"_id",如果在生成...

微笑向暖wx
54分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部