- NSOperation
// 繼承NSOperation
@interface MyNSoperation : NSOperation
@property (nonatomic, strong) UIImage *image;
@end
@implementation MyNSoperation
- (void)main {
_image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://ws3.sinaimg.cn/large/006tKfTcgy1fjt9s573oxj30zk0qo0vp.jpg"]]];
}
@end
// 使用NSOperation
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
_myImageView.image = nil;
MyNSoperation *op = [[MyNSoperation alloc] init];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
__weak typeof(op) waekOp = op;
op.completionBlock = ^{
UIImage *image = waekOp.image;
dispatch_async(dispatch_get_main_queue(), ^{
_myImageView.image = image;
});
};
[queue addOperation:op];
}
-
現(xiàn)成的繼承類
- NSBlockOperation
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { _myImageView.image = nil; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{ UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://ws3.sinaimg.cn/large/006tKfTcgy1fjt9s573oxj30zk0qo0vp.jpg"]]]; dispatch_async(dispatch_get_main_queue(), ^{ self.myImageView.image = image; }); }]; [queue addOperation:op]; }
- NSInvocationOperation
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { _myImageView.image = nil; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage) object:nil]; [queue addOperation:op]; } - (void)downloadImage { UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://ws3.sinaimg.cn/large/006tKfTcgy1fjt9s573oxj30zk0qo0vp.jpg"]]]; dispatch_async(dispatch_get_main_queue(), ^{ _myImageView.image = image; }); }
- 控制Queue最大并發(fā)數(shù)(為1時(shí)是串行Queue)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 3;
- 獲取主線程
[NSOperationQueue mainQueue];
- 讀取當(dāng)前Operation個(gè)數(shù)
[queue operationCount];
-
cancel
cancel在隊(duì)列中的Operation不會(huì)執(zhí)行其中的main函數(shù),直接調(diào)用complete。
cancel在線程中的Operation执赡,該Operation被標(biāo)記為isCancel儿礼,繼續(xù)執(zhí)行完其中的main函數(shù),執(zhí)行complete颅拦。
cancel還未加入隊(duì)列中的Operation則直接變成cancel狀態(tài)
- 等待隊(duì)列完成后繼續(xù)操作
[queue waitUntilAllOperationsAreFinished];
等待Operation完成
等待依賴的Operation完成 - Dependency
#import "FirstViewController.h"
@interface FirstViewController () {
NSArray *_urls;
NSOperationQueue *_downloadImageQueue;
NSBlockOperation *_finalOperation;
}
@property (weak, nonatomic) IBOutlet UIImageView *imageView1;
@property (weak, nonatomic) IBOutlet UIImageView *imageView2;
@property (weak, nonatomic) IBOutlet UIImageView *imageView3;
@property (weak, nonatomic) IBOutlet UIImageView *indicateImageView;
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
_urls = @[@"https://ws3.sinaimg.cn/large/006tKfTcgy1fjt9s573oxj30zk0qo0vp.jpg",
@"https://ws3.sinaimg.cn/large/006tKfTcgy1fjtg0xmaptj30lz082q41.jpg",
@"https://ws2.sinaimg.cn/large/006tKfTcgy1fjtise0maxj30ia0pljsm.jpg"];
_downloadImageQueue = [[NSOperationQueue alloc] init];
[self finishedDownload];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSArray *imageViews =@[_imageView1, _imageView2, _imageView3];
[_downloadImageQueue setMaxConcurrentOperationCount:3];
for (NSString *urlString in _urls) {
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]];
dispatch_async(dispatch_get_main_queue(), ^{
((UIImageView *)[imageViews objectAtIndex:[_urls indexOfObject:urlString]]).image = image;
});
}];
[_downloadImageQueue addOperation:op];
[_finalOperation addDependency:op];
}
NSOperationQueue *finalQueue = [[NSOperationQueue alloc] init];
[finalQueue addOperation:_finalOperation];
}
- (void)finishedDownload {
_finalOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"finished!");
dispatch_async(dispatch_get_main_queue(), ^{
[_indicateImageView setHidden:YES];
});
}];
}
@end
-
循環(huán)依賴
- 優(yōu)先級(jí)
// 高優(yōu)先級(jí)總在低優(yōu)先級(jí)之前運(yùn)行
typedef NS_ENUM(NSInteger, NSOperationQueuePriority) {
NSOperationQueuePriorityVeryLow = -8L,
NSOperationQueuePriorityLow = -4L,
NSOperationQueuePriorityNormal = 0,
NSOperationQueuePriorityHigh = 4,
NSOperationQueuePriorityVeryHigh = 8
};
@property NSOperationQueuePriority queuePriority;
高優(yōu)先級(jí)的Operation進(jìn)入隊(duì)列會(huì)擠占低優(yōu)先級(jí)Operation的位置壕探,但是不會(huì)擠占正在運(yùn)行的Operation的位置