天天看点

文章标题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

继续阅读