iOS 多线程
0. 多线程简介
参考:http://blog.csdn.net/shenjie12345678/article/details/44152605
现在的CPU都是多核心的,即是是单核也可能模拟出多核心效果。当有多个任务执行时,多线程就变得很重要。多线程分为两种,一种是并发,一种是并行。所谓并发,就是在一个CPU里面有多个线程的情况,这种情况下,通过区分线程的优先级,来使UI线程即主线程有限执行, 使界面操作不会卡顿,用户体验得到提高;另外一种情况就是多个CPU的情况下,即并行。这时,多个任务可以同时执行,真正地提高了运行效率。
由于UI线程不能卡顿,所以多线程就会变得很重要,甚至说是必不可少。
1. 多线程使用
现在,iOS的多线程技术有三种,NSThread、NSOpration、GCD。它们是先后产生的技术,但是有没有区分使用的必要呢,还是只需要使用最后的GCD技术,下面我来探讨一下。
1.1. NSThread
该技术是轻量级的多线程技术,使用简单,但是需要自己管理线程的生命周期。
创建方法有两种,直接把操作添加到线程中并启动,或者创建一个线程对象,然后调用start方法启动。
1.1.1. 单线程示例
点击一个按钮,使用NSTread 下载一个图片。
1.1.1.1. 解决http图片请求问题
请求http图片,要在info.list下面添加并选择对应选项:
App Transport Security Settings ,Allow Arbitrary Loads
1.1.1.2. 界面
界面用xib或storyboard来做。
1.1.1.3. 代码
1.1.1.3.1. 请求网路图片
-(NSData *)requestData{ //对于多线程操作建议把线程操作放到@autoreleasepool中 @autoreleasepool { NSURL *url=[NSURL URLWithString:@"http://www.sinaimg.cn/dy/slidenews/1_img/2015_49/2841_639228_655991.jpg"]; NSData *data=[NSData dataWithContentsOfURL:url]; return data; } }
1.1.1.3.2. 显示图片
-(void)loadImage{ //请求数据 NSData *data= [self requestData]; /*将数据显示到UI控件,注意只能在主线程中更新UI, 另外performSelectorOnMainThread方法是NSObject的分类方法,每个NSObject对象都有此方法, 它调用的selector方法是当前调用控件的方法,例如使用UIImageView调用的时候selector就是UIImageView的方法 Object:代表调用方法的参数,不过只能传递一个参数(如果有多个参数请使用对象进行封装) waitUntilDone:是否线程任务完成执行 */ [self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES]; } #pragma mark 将图片显示到界面 -(void)updateImage:(NSData *)imageData{ UIImage *image=[UIImage imageWithData:imageData]; _imageView.image=image; }
1.1.1.3.3. 启动请求
这是要在按钮事件中加入的代码:
//方法1:使用对象方法 //创建一个线程,第一个参数是请求的操作,第二个参数是操作方法的参数 // NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage) object:nil]; // //启动一个线程,注意启动一个线程并非就一定立即执行,而是处于就绪状态,当系统调度时才真正执行 // [thread start]; //方法2:使用类方法 [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
1.1.2. 多线程示例
界面就不说了,直接上代码。
1.1.2.1. 图片数据类
用于保存图片对应的多个UIImageView的索引和图片数据。
#import <Foundation/Foundation.h> @interface KCImageData : NSObject #pragma mark 索引 @property (nonatomic,assign) int index; #pragma mark 图片数据 @property (nonatomic,strong) NSData *data; @end
1.1.2.2. 使用CollectionView显示图片