天天看點

文章标題import “ViewController.h”import “DownloadOperation.h”import import import “DownloadOperation.h”

//

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

繼續閱讀