//
// ViewController.m
// UI-NO-25-多线程-NSOperating
//
// Created by 杨政涛 on 15/8/27.
// Copyright (c) 2015年 杨政涛. All rights reserved.
//
import “ViewController.h”
import “DownloadOperation.h”
@interface ViewController ()
{
UIImageView *imageView;
}
@end
@implementation ViewController
-
(void)viewDidLoad {
[super viewDidLoad];
/*
// 不能直接使用NSOperation 是因为 它里面没有可以直接操作的方法 只是哟个基类(抽象类)
NSInvocationOperation *invocayion = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act:) object:@”invocayion”];
// 如果单独使用NSOperation 必须手动启动
// [invocayion start];
// NSOperation 默认实在当前线程(主线程)去执行的(同步执行)
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
// 在这里面写具体执行的方法
[self act:@”blockOperation”];
}];
// 给它添加操作数
[blockOperation addExecutionBlock:^{
[self act:@”blockOperation2”];
}]; //此时 NSBlockOperation 操作数大于1(添加了一个,加上前面的一个就是2个) 此时这个线程就不在主线程执行,会自动开辟一个线程执行
// 也要手动启动
// [blockOperation start];
// 再添加一个NSInvocationOperation
NSInvocationOperation *invocayion1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act:) object:@”invocayion1”];
// [invocayion1 start];
// 此时它也是在主线程执行 (因为只是重新初始化了另外一个对象)
// 多创建几个:
NSInvocationOperation *invocayion2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act:) object:@”invocayion2”];
NSInvocationOperation *invocayion3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act:) object:@”invocayion3”];
NSInvocationOperation *invocayion4 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act:) object:@”invocayion4”];
NSInvocationOperation *invocayion5 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act:) object:@”invocayion5”];
//此时我们用NSOperationQueue(线程队列)管理线程 (默认会自动开辟线程去执行)⭐️⭐️⭐️⭐️⭐️⭐️不用手动去启动线程
// NSOperationQueue 是 异步执行
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
// 设置线程队列的最大并发数 (最多可以允许几个操作同时执行)
queue.maxConcurrentOperationCount = 2; //每一次只是执行一个操作 尽量不要写太多
// ⭐️⭐️⭐️⭐️⭐️最大并发数为1的时候 是按顺序一个一个执行 ,最大并发数为其他数,就不会按顺序执行了
[queue addOperation:invocayion];
[queue addOperation:invocayion1];
//⭐️⭐️⭐️⭐️⭐️ 此时必须把手动启动给注释掉 因为它会自动开辟线程 自动启动
[queue addOperation:invocayion2];
[queue addOperation:invocayion3];
[queue addOperation:invocayion4];
[queue addOperation:invocayion5];
[queue addOperation:blockOperation];
*/
// 接受通知:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(getimage:) name:@”下载完成” object:nil];
imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
[self.view addSubview:imageView];
DownloadOperation *download = [[DownloadOperation alloc]initWithDownLoadMessageURL:@"http://file.bmob.cn/M01/37/F1/oYYBAFXdo8yAFY8QAABIFt81XEM849.png"];
// 如果调用Block的时候 还未实现Block 程序就会崩溃 所以实现 必须写在[download start];的前面 因为当[download start]的时候,先调用block
// download.bringBlock = ^(UIImage *image){
//
// imageView.image = image;
// };
//
// [download start];
// 异步加载图片
NSOperationQueue *quene = [[NSOperationQueue alloc]init];
quene.maxConcurrentOperationCount = 1;
[quene addOperation:download];
}
//通知传值
-(void)getimage:(NSNotification *)sender
{
imageView.image = sender.object;
}
-(void)act:(id)sender
{
NSLog(@”%@\n%@”,sender,[NSThread currentThread]);
}
-
(void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
//
// DownloadOperation.h
// UI-NO-25-多线程-NSOperating
//
// Created by 杨政涛 on 15/8/27.
// Copyright (c) 2015年 杨政涛. All rights reserved.
//
import
import
import “DownloadOperation.h”
@implementation DownloadOperation
-(instancetype)initWithDownLoadMessageURL:(NSString *)url
{
self = [super init];
if (self) {
urlString = url;
}
return self;
}
//Operation start 的时候干什么操作 就必须写main这个方法里面
//⭐️⭐️⭐️⭐️⭐️
-(void)main
{
NSLog(@”我是一个自定义的Operation”);
NSURL*url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
UIImage *image = [UIImage imageWithData:data];
NSLog(@"%@",image);
// self.bringBlock(image);
// 使用通知传值
[[NSNotificationCenter defaultCenter]postNotificationName:@"下载完成" object:image];
}
@end