iOS 多线程( GCD NSThread )

1.NSThread

①.开线程的几种方式

*先创建, 后启动

//开启线程
    NSThread *thread =[[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];
    //启动
    [thread start];

    //直接启动
    [NSThread detachNewThreadSelector:@selector(<#selector#>) toTarget:self withObject:nil];

②.其他用法

    //获取当前线程
    NSThread *current =[NSThread currentThread];

    //获得主线程
    + (NSThread* )mainThread;
    //线程间通信 (从子线程回到主线程)    - (void)performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>

CGD(重点)

1.队列的类型

*并发队列:可以同时执行多个任务

获得全局的并发队列:dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)

*串行队列:一个任务执行完了才能执行下一个任务

a.自己创建:dispatch_queue_create

b.主队列:dispatch_get_main_queue

2.执行任务的方法类型

*同步(sync)执行:只能在当前线程执行任务

*异步(async)执行:可以多个线程执行任务(系统会自动给你开辟的,你只要写要做什么)

3.了解队列的方法配合使用

*异步并发队列

//获取全局的并发队列
    //第一个参数代表优先级
    dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.添加任务到队列中,执行 任务
    dispatch_async(queue, ^{
        NSLog(@"------下载图片1-------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"------下载图片1-------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"------下载图片1-------%@",[NSThread currentThread]);
    });
    //总结:同时开启了3个线程

*异步串行队列

  //1.创建串行队列
 dispatch_queue_t queue=   dispatch_queue_create("com.itheima.queue ", NULL);
    dispatch_async(queue, ^{
        NSLog(@"------下载图片1-------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"------下载图片1-------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"------下载图片1-------%@",[NSThread currentThread]);
    });
    //总结:只会开一个线程;

*同步串行

//创建串行队列
    dispatch_queue_t queue=dispatch_queue_create("wangbinbin.queue", NULL);
    //2.添加任务到队列中,执行 任务
    dispatch_sync(queue, ^{
        NSLog(@"------下载图片1-------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{

        NSLog(@"------下载图片2-------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{

        NSLog(@"------下载图片3-------%@",[NSThread currentThread]);
    });

    //总结:不会开辟线程 只在当前线程执行(当前线程为主线程, dispatch_sync是在主线程)

*同步并发队列

//获取全局的并发队列
    //第一个参数代表优先级
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //2.添加任务到队列中,执行 任务
    dispatch_sync(queue, ^{

        NSLog(@"------下载图片1-------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{

        NSLog(@"------下载图片2-------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"------下载图片2-------%@",[NSThread currentThread]);
    });

    //总结:不会开启新的线程,并发队列失去了并发功能

GCD其他常用方法

1.从子线程回到主线程

 NSLog(@"%@",[NSThread currentThread]);
    //异步并发队列
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"------%@",[NSThread currentThread]);

        //请求图片
        NSURL *url =[NSURL URLWithString:@"http://img.taopic.com/uploads/allimg/110812/1820-110Q20K01549.jpg"];
        NSData *data =[NSData dataWithContentsOfURL:url];
        UIImage *image=[UIImage imageWithData:data];

        //回到主线程显示图片
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"+++%@",[NSThread currentThread]);
            self.imgView.image=image;
        });

    });

2.一次性代码

//一次性代码  单例里面用得到
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        NSLog(@"只执行一次,");
    });

3.延时操作

//延时操作 2秒后
    //计算时间
    dispatch_time_t when=dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));

    //会在when这个时间点,执行queue(队列可以自己选择)
    dispatch_after(when, dispatch_get_main_queue(), ^{

        NSLog(@"瞧我!!");
    });

4.队列组

有这么一种需求
  首先:分别异步执行2个耗时的操作
  其次:等2个异步操作都执行完毕后,再回到主线程执行操作

//创建一个组
    dispatch_group_t group =dispatch_group_create();
    //开启一个任务下载图片1
   __block UIImage *image1 =nil;
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

       image1 =[self requestImageWithUrl:@"http://d.hiphotos.baidu.com/image/pic/item/faedab64034f78f09c7428247d310a55b2191ced.jpg"];

    });

    //开启一个任务下载图片2
    __block UIImage *image2 =nil;
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        image2 =[self requestImageWithUrl:@"http://b.hiphotos.baidu.com/image/h%3D360/sign=502eb6fad954564efa65e23f83df9cde/80cb39dbb6fd5266c96cb6fdaf18972bd5073697.jpg"];
    });

    //等group中的所有任务都执行完毕,在执行其他操作
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        self.UIImageView1.image=image1;
        self.UIImageView2.image=image2;

        //合并2个image
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0);
        [image1 drawInRect:CGRectMake(0, 0, 100, 100)];
        [image2 drawInRect:CGRectMake(100, 0, 100, 100)];
        self.bigUiImageView.image=UIGraphicsGetImageFromCurrentImageContext();
        //关闭上下文
        UIGraphicsEndImageContext();

    });
时间: 2024-12-25 10:12:18

iOS 多线程( GCD NSThread )的相关文章

iOS多线程-NSThread

本文转载自嘟嘟夜未央的博文:http://www.cnblogs.com/huluo666/p/3645889.html,修改了部分代码和贴图,如有侵犯版权请与我联系删除. 多线程这个概念的接触是蛮早的时候了,当时还是单核单CPU的时候,Thread这个概念已经出现了,当时比较流行的方案是时间片轮流,线程可以优先级抢占,但一次只能运行一个线程,实际上多线程是不能真正并行处理的,只是宏观上表现的多线程在齐头并进.现在硬件进步了很多,多核的CPU时代来临了,于是线程开始了真正意义上的并行处理,多线程

iOS多线程 GCD

iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. *

iOS多线程GCD

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. * * @discussi

深入IOS多线程 GCD(一)

一,什么是GCD GCD是异步执行任务的技术之一,一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的dispatch queue中,GCD就能生成必要的线程并计划执行任务.由于线程管理师作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率. 也就是说GCD用我们难以置信的非常简单的记述方法,实现了极为复杂的多线程编程,可以说这是一项划时代的技术.下面是使用了GCD源码的例子,虽然稍微抽象,但从中也能感受到GCD的威力 d

iOS多线程开发--NSThread NSOperation GCD

多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势必影响用户体验.早在单核处理器时期 就有多线程,这个时候多线程更多的用于解决线程阻塞造成的用户等待(通常是操作完UI后用户不再干涉,其他线程在等待队列中,CPU一旦空闲就继续执行, 不影响用户其他UI操作),其处理能力并没有明显的变化.如今无论是移动操作系统还是PC.服务器都是多核处理器,于是“并行

iOS多线程开发——NSThread浅析

在IOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,可以参考<iOS多线程开发--NSOperation/NSOperationQueue浅析><iOS多线程开发--GCD的使用与多线程开发浅析>.以及对于多线程中的同步异步,并行串行等概念,我在<GCD实践--串行队列/并发队列与iOS多线程详解>中也有较为详细的讲解.为了学习的完整性,今天我们主要从代码层面来实现

IOS 多线程GCD的使用[转载于新浪微博, 原作者:太阳石]

原文 在红黑联盟上看到一篇关于多线程GCD的教程文章,写的深入浅出,特转载于此,以备不时之需.原文链接另:补充两个GCD代码,都是Xcode snippet里面提供的:1.Dispatch After主要用于延迟执行一些代码.例子: int64_t delayInSeconds = 1.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_aft

iOS 多线程GCD的基本使用

<iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 /** * 异步函数 + 并发队列:可以同时开启多条线程 */ - (void)asyncConcurrent { // 1.创建一个并发队列 // dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // label

iOS 多线程 GCD part3:API

https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 #define NSEC_PER_SEC 1000000000ull #define NSEC_PER_MSEC 1000000ull #define USEC_PER_SEC 1000000ull #define NSEC_PER_USEC 1000ull MSEC:毫秒 USEC:微秒 NSE