//
// 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