文章标题

来源:互联网 发布:中国10月经济数据 编辑:程序博客网 时间:2024/06/06 07:35

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

0 0
原创粉丝点击