13、自定义NSOperation





//自定义操作
//1 创建一个类继承自NSOperation
//2 重写main方法,自动释放池
//3 定义属性接收参数 , 类方法快速初始化自定义操作
//4 取消操作(取消正在执行的操作)
//5 断言NSAssert
@interface HMDownloaderOperation : NSOperation
//要下载图片的地址
@property (nonatomic, copy) NSString *urlString;
//执行完成后,回调的block
@property (nonatomic, copy) void (^finishedBlock)(UIImage *img);

+ (instancetype)downloaderOperationWithURLString:(NSString *)urlString finishedBlock:(void(^)(UIImage *img))finishedBlock;
@end


@implementation HMDownloaderOperation
+ (instancetype)downloaderOperationWithURLString:(NSString *)urlString finishedBlock:(void (^)(UIImage *))finishedBlock {
HMDownloaderOperation *op = [[HMDownloaderOperation alloc] init];
op.urlString = urlString;
op.finishedBlock = finishedBlock;
return op;
}

- (void)main {
@autoreleasepool {
//断言
NSAssert(self.finishedBlock != nil, @"finishedBlock 不能为nil");
//模拟网络延时
[NSThread sleepForTimeInterval:2.0];

//判断是否被取消 取消正在执行的操作
if (self.isCancelled) {
return;
}
NSLog(@"下载图片 %@ %@",self.urlString,[NSThread currentThread]);
//UIImage
//假设图片下载完成
//回到主线程更新UI
// if (self.finishedBlock) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.finishedBlock(self.urlString);
}];
// }
}
}
@end

-------------------------------------ViewController-------------------------------------
@interface ViewController ()
//全局队列
@property (nonatomic, strong) NSOperationQueue *queue;
@end

@implementation ViewController
//懒加载
- (NSOperationQueue *)queue {
if (_queue == nil) {
_queue = [[NSOperationQueue alloc] init];
_queue.maxConcurrentOperationCount = 2;
}
return _queue;
}

- (void)viewDidLoad {
[super viewDidLoad];

for (int i = 0; i<20; i++) {
HMDownloaderOperation *op = [HMDownloaderOperation downloaderOperationWithURLString:@"abc.jpg" finishedBlock:^(UIImage *img) {
//图片下载完成更新UI
NSLog(@"更新UI %d %@",i,[NSThread currentThread]);
}];
[self.queue addOperation:op];
}

//演示断言
// HMDownloaderOperation *op = [HMDownloaderOperation downloaderOperationWithURLString:@"abc.jpg" finishedBlock:nil];
// [self.queue addOperation:op];
// //自定义操作
// HMDownloaderOperation *op = [[HMDownloaderOperation alloc] init];
// op.urlString = @"xxx.jpg";
// //无法传递参数
//// [op setCompletionBlock:^{
////
//// NSLog(@"给控件赋值");
//// }];
//
// [op setFinishedBlock:^(UIImage *img) {
// NSLog(@"给控件赋值 %@",img);
// }];
//
// [self.queue addOperation:op];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//设置所有操作的canceled属性为yes
[self.queue cancelAllOperations];
NSLog(@"取消");
}

@end






猜你喜欢

转载自blog.csdn.net/daidaishuiping/article/details/80262381
今日推荐