zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    单体架构还是微服务架构,这是个问题?
    ASP.NET 5中的ASP.NET Bundles跑到哪里去了?
    如何在ASP.NET MVC和EF中使用AngularJS
    在VS 2015中边调试边分析性能
    C#中的Infinity有个小坑
    利用Roslyn构建一个简单的C#交互脚本引擎
    移动端跨平台开发干货分享
    在ASP.NET 5中读取配置文件
    5个让你的SaaS应用大卖的技巧
    大数据技术之_19_Spark学习_08_Spark 机器学习_01_机器学习概述 + 机器学习的相关概念 + 算法常用指标
  • 原文地址:https://www.cnblogs.com/SimonGao/p/5009133.html
Copyright © 2011-2022 走看看