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显示图片

  iOS 之UICollectionView

原文地址:https://www.cnblogs.com/SimonGao/p/5009133.html