博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义NSOperation
阅读量:4086 次
发布时间:2019-05-25

本文共 2415 字,大约阅读时间需要 8 分钟。

"vc控制器"#import "ViewController.h"#import "DownloaderOperation.h"@interface ViewController ()@property (nonatomic, strong) NSOperationQueue *queue;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // 1.实例化全局队列    self.queue = [[NSOperationQueue alloc] init];    // 图片地址    NSString *URLString = @"http://cdn.duitang.com/uploads/item/201601/09/20160109170639_wkEfa.jpeg";    // 下载完成的代码块    void (^successBlock)() = ^(UIImage *image){        NSLog(@"%@ - %@",image,[NSThread currentThread]);    };    // 2.创建自定义的操作对象    DownloaderOperation *op = [DownloaderOperation downloaderOperationWithURLString:URLString successBlock:successBlock];    // 3.把自定义的操作对象添加到队列    [self.queue addOperation:op];}

"DownloaderOperation.h"#import 
#import
@interface DownloaderOperation : NSOperation/** 实例化自定义操作对象的主方法 @param URLString 接收VC传入的图片地址 @param successBlock 接收VC传入的下载完成的代码块 @return 返回自定义的操作对象 */+ (instancetype)downloaderOperationWithURLString:(NSString *)URLString successBlock:(void(^)(UIImage *image))successBlock;@end

DownloaderOperation.m/* DownloaderOperation的作用 1.异步下载网络图片    需要图片的地址 2.使用block把图片数据传递到VC */#import "DownloaderOperation.h"@interface DownloaderOperation ()/// 接收VC传入的图片地址@property (nonatomic, copy) NSString *URLString;/// 接收VC传入的下载完成的代码块@property (nonatomic, copy) void(^successBlock)(UIImage *image);@end@implementation DownloaderOperation+ (instancetype)downloaderOperationWithURLString:(NSString *)URLString successBlock:(void (^)(UIImage *))successBlock{    DownloaderOperation *op = [[DownloaderOperation alloc] init];    // 保存外界传入的数据    op.URLString = URLString;    op.successBlock = successBlock;    return op;}// 任何操作在执行执行都会调用main方法 : 一旦队列调度操作执行,首先自动执行start方法,然后自动执行main方法/// 重写main方法 : 所有操作的入口- (void)main{    NSLog(@"传入 %@",self.URLString);    // 异步下载    NSURL *URL = [NSURL URLWithString:self.URLString];    NSData *data = [NSData dataWithContentsOfURL:URL];    UIImage *image = [UIImage imageWithData:data];    // 断言 : 保证某一个条件一定是满足的;如果不满足,就直接崩溃,并且提供崩溃的自定义的信息    // 提示: 只在开发阶段有效,APP上线之后,就无效了    NSAssert(self.successBlock != nil, @"图片下载完成的回调不能为空!");    // 图片下载完成之后,需要把图片传递到VC//    if (self.successBlock != nil) {
// 回到主线程,回调VC传入的代码块; // 提示 : block 和 代理 和 通知 ,在哪个线程回调block/发送代理消息/发送通知,那么就在哪个线程执行相关方法 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ self.successBlock(image); }];// }}@end

转载地址:http://cfkii.baihongyu.com/

你可能感兴趣的文章
一个很棒的Flutter学习资源列表
查看>>
为什么你应该放弃React老的Context API用新的Context API
查看>>
Flutter 布局控件完结篇
查看>>
Koa2初体验
查看>>
Koa 2 初体验(二)
查看>>
Koa2框架原理解析和实现
查看>>
vue源码系列文章good
查看>>
你不知道的Virtual DOM
查看>>
VUE面试题总结
查看>>
写好JavaScript条件语句的5条守则
查看>>
原生JS中DOM节点相关API合集
查看>>
【TINY4412】U-BOOT移植笔记:(7)SDRAM驱动
查看>>
【TINY4412】U-BOOT移植笔记:(12)BEEP驱动
查看>>
单链表的修改和删除
查看>>
C++的三个基本特征:封装、继承、多态
查看>>
C++虚函数的总结
查看>>
什么是URL地址?
查看>>
C++多态的实现方式总结
查看>>
学习C++需要注意的问题
查看>>
C++模板
查看>>