IOS线程学习
NSThread创建
//类对象创建
[thread start];
2
//类加方法直接创建
[NSThread detachNewThreadSelector:@selector(second) toTarget:self withObject:nil];
[self performSelectorInBackground:@selector(third) withObject:nil];
3系统方法
[self performSelectorOnMainThread:@selector(func) withObject:nil waitUntilDone: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