文章标题
来源:互联网 发布:中国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
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 常见的设计模式
- java23种设计模式之装饰模式(Decorator)
- 在我程序员之路的开始写点东西吧
- Mac下如何统计一个目录下所有代码文件的总行数
- OC学习笔记 (10-15-18)
- 文章标题
- tomcat内存配置
- Remove Element
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- 文章标题
- DC综合简单总结
- 2014 北京区域赛题目
- php中cookie跨域的解决方案以及IE和safari浏览器中的坑
- iOS开发网络篇之文件下载、大文件下载、断点下载