自定义NSOperation

"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 <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zok93

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值