IOS线程进阶
来源:互联网 发布:茅台防伪溯源软件 编辑:程序博客网 时间:2024/05/22 16:01
IOS线程学习
NSThread创建
//类对象创建
[threadstart];
2
//类加方法直接创建
[NSThreaddetachNewThreadSelector:@selector(second)toTarget:selfwithObject:nil];
[selfperformSelectorInBackground:@selector(third)withObject:nil];
3系统方法
[selfperformSelectorOnMainThread:@selector(func)withObject:nilwaitUntilDone:NO];
二.多线程进阶
NSOperation&NSOperationQueue
很多时候我们使用多线程,需要控制线程的并发数,毕竟线程也是消耗系统资源的,当程序中同时运行的线程过多时,系统必然变慢。 所以很多时候我们会控制同时运行线程的数目。
NSOperation可以封装我们的操作,然后将创建好的NSOperation对象放到NSOperationQueue中,OperationQueue便开始启动新的线程去执行队列中的操作,OperationQueue的并发度是可以通过如下方式进行设置:
- - (void)setMaxConcurrentOperationCount:(NSInteger)count
- (void)operation{
//操作队列
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
//最大并行数量
queue.maxConcurrentOperationCount=3;
for (int i=1; i<11; i++) {
MyOperation *operation=[[MyOperation alloc]init];
operation.time=i;
//添加到队列
[queue addOperation:operation];
[operation release];
}
}
#import <Foundation/Foundation.h>
@interface MyOperation : NSOperation
@property (nonatomic, assign)int time;
@end
#import "MyOperation.h"
@implementation MyOperation
//
- (void)main{
sleep(self.time);
NSLog(@"%d",self.time);
}
@end
GCD
GCD是Grand Central Dispatch的缩写,是一系列的BSD层面的接口,在Mac 10.6 和iOS4.0以后才引入的,且现在NSOperation和NSOperationQueue的多线程的实现就是基于GCD的。目前这个特性也被移植到 FreeBSD上了,可以查看libdispatch这个开源项目。
比如一个在UIImageView中显示一个比较大的图片
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(100, 230, 100, 30);
[button setTitle:@"标题" forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(110, 10, 100, 200)];
[self.view addSubview:_imageView];
}
- (void)buttonClick{
//[self gcd];
//[self gcdGroup];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURL* url = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/news/pic/item/f3d3572c11dfa9ecde69b09e60d0f703908fc1f0.jpg"];
NSData* data = [NSData dataWithContentsOfURL:url];
NSLog(@"下载完成");
UIImage* image = [UIImage imageWithData:data];
//主线程
dispatch_async(dispatch_get_main_queue(), ^{
_imageView.image = image;
});
});
}
- (void)gcdGroup{
//创建组
dispatch_group_t t = dispatch_group_create();
dispatch_group_async(t, dispatch_get_global_queue(0, 0), ^{
[self first];
});
dispatch_group_async(t, dispatch_get_global_queue(0, 0), ^{
[self second];
});
dispatch_group_async(t, dispatch_get_global_queue(0, 0), ^{
[self third];
});
dispatch_group_notify(t, dispatch_get_global_queue(0, 0), ^{
NSLog(@"执行完成");
});
}
- (void)gcd{
dispatch_queue_t t = dispatch_queue_create(NULL, NULL);
//想成在t线程里执行block里面的语句
dispatch_async(t, ^{
[self first];
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self second];
});
}
- (void)first{
sleep(1);
NSLog(@"1");
}
- (void)second{
sleep(2);
NSLog(@"2");
}
- (void)third{
sleep(3);
NSLog(@"3");
}
@end
- IOS线程进阶
- ios开发进阶之多线程02 NSOperation
- ios开发进阶之多线程01 线程 GCD
- 线程进阶
- ios开发进阶之多线程03 RunLoop 网络编程
- [iOS] 进阶。
- IOS 进阶
- iOS进阶
- ios进阶
- java线程进阶
- androidj进阶之多线程
- Java进阶之多线程
- Java进阶 - 线程探索
- Java进阶之多线程
- Android进阶-线程池
- iOS开发-进阶:子线程更新UI的两种方法
- ios 进阶 -- 触摸事件
- ios 进阶 -- NSRunLoop 解析
- 移动硬盘文件丢失如何找回丨500G硬盘
- Eclipse 常用开关设置
- 找到某个文件夹 删除此文件夹下30天以前的.c文件
- oracle分区表
- PAT A 1024. Palindromic Number (25)
- IOS线程进阶
- 从输入 URL 到页面加载完的过程中都发生了什么事情 —— 网络优化篇
- nyoj 2 括号配对问题水
- android 移动开发 SQLiteOpenHelper
- Spring RMI远程调用时的内外网端口映射问题
- 第七周作业——动态规划求最大递增子序列
- 生活的态度
- CodeMonkey
- 一些资源