文章標題

//
// 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 是一個基類(抽象類)不能夠直接使用 必須使用他的子類 它默認是在當前線程進行操作 如果只是單獨使用NSOperation必須手動啓用

    常與NSOperationQueue(線程隊列)一起使用 在與NSOperationQueue一起使用的時候,會自動開闢一個線程進行操作 (此時不用手動啓用)

    NSOperation 系統提供給了我們兩個子類:NSInvocationOperation、NSBlockOperation 還有自定義的子類

    NSBlockOperation 操作數大於1 也會開闢線程去執行操作

    單一使用NSOperation它是同步執行

    NSOperation類是用來封裝與單個任務相關的代碼和數據的抽象類,因爲它是抽象的,不能夠直接使用這個類,而是繼承

    */

    /*

// 不能直接使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章