进程与线程
主线程内里执行耗时操作会导致界面阻塞,所以一般把耗时操作放到子线程执行,例如网络恳求、线程睡眠、加载文件、大量运算。
1、不要把耗时操作放到主线程。
2、不要把修改页面的代码放到子线程(子线程修改页面不会比及实时更新)
第一种开启子线程的要领
NSThread
//开启一个子线程
[NSThread detachNewThreadSelector:@selector(createMouse) toTarget:selfwithObject:nil];
//返回主线程
[self performSelectorOnMainThread:@selector(updateUI:) withObject:self.mouse waitUntilDone:NO];
第二种开启子线程的要领
**
Grand Central Dispatch (**)是Apple开发的一个多核编程的解决要领,自己创建的线程队列为串行队列,获取体系提供的线程队列为并行队列。
//开启一个子线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.imagaPaths[indexPath.row]]];
UIImage *image = [UIImage imageWithData:data];
//返回主线程
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageView.image = image;
[cell setNeedsLayout];
});
});
第三种开启子线程的要领
NSOperation
创建出来的线程队列默许为并行队列。
- (void)viewDidLoad
{
[super viewDidLoad];
//方法一 开启一个线程
NSOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(newThreadAction) object:nil];
//方法二 开启一个线程
NSOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
for (int i=0; i<5; i++) {
[NSThread sleepForTimeInterval:.5];
NSLog(@"线程2--%d",i);
}
}];
//创建线程队列,默许创建出来的线程队列为并行队列
NSOperationQueue *myQueue = [[NSOperationQueue alloc]init];
//设置最大同时执行的线程数量
[myQueue setMaxConcurrentOperationCount:1];
//给op1添加一个依赖 依赖op2
[op1 addDependency:op2];
//将线程添加到队列,线程添加到队列后才会执行
[myQueue addOperation:op1];
[myQueue addOperation:op2];
}
- (void)newThreadAction{
for (int i=0; i<5; i++) {
[NSThread sleepForTimeInterval:.5];
NSLog(@"线程1--%d",i);
}
}
**与NSOperation的区别
1、**,代码更简洁,使用越发方便,**越发高效,由于属于C言语的语法,更底层。
2、NSOperation,机动控制线程之间的关系,可以设置同时执行的线程数量。
//设置最大同时执行的线程数量,如果设置为1,则相称于线程串行执行
[myQueue setMaxConcurrentOperationCount:1];
//给op1添加一个依赖 依赖op2,先执行op2,再执行op1
[op1 addDependency:op2];
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|