GCD 常用代码

体验代码

异步执行任务

- (void)gcdDemo1 {
    // 1. 全局队列
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);

    // 2. 任务
    void (^task)() = ^ {
        NSLog(@"%@", [NSThread currentThread]);
    };

    // 3. 指定执行任务的函数
    // 异步执行任务 - 新建线程,在新线程执行 task
    dispatch_async(q, task);

    NSLog(@"come here");
}

注意:如果等待时间长一些,会发现线程的 number 发生变化,由此可以推断 gcd 底层线程池的工作

同步执行任务

- (void)gcdDemo1 {
    // 1. 全局队列
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);

    // 2. 任务
    void (^task)() = ^ {
        NSLog(@"%@", [NSThread currentThread]);
    };

    // 3. 指定执行任务的函数
    // 同步执行任务 - 不开启线程,在当前线程执行 task
    dispatch_sync(q, task);

    NSLog(@"come here");
}

精简代码

- (void)gcdDemo2 {
    for (int i = 0; i < 10; ++i) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSLog(@"%@ %@", [NSThread currentThread], @"hello");
        });
    }
}

与 NSThread 的对比

  1. 所有的代码写在一起的,让代码更加简单,易于阅读和维护

    • NSThread 通过 @selector 指定要执行的方法,代码分散
    • GCD 通过 block 指定要执行的代码,代码集中
  2. 使用 GCD 不需要管理线程的创建/销毁/复用的过程!程序员不用关心线程的生命周期
  3. 如果要开多个线程 NSThread 必须实例化多个线程对象
  4. NSThread 靠 NSObject 的分类方法实现的线程间通讯,GCD 靠 block

线程间通讯

- (void)gcdDemo3 {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"耗时操作 %@", [NSThread currentThread]);

        // 耗时操作之后,更新UI
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"更新 UI %@", [NSThread currentThread]);
        });
    });
}

以上代码是 GCD 最常用代码组合!

  • 如果要在更新 UI 之后,继续做些事情,可以使用以下代码
- (void)gcdDemo4 {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"耗时操作");

        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"更新UI");
        });

        NSLog(@"更新UI完毕");
    });
}

网络下载图片

- (void)viewDidLoad {
    [super viewDidLoad];

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"%s %@", __FUNCTION__, [NSThread currentThread]);

        // 1. 异步下载网络图片
        NSURL *url = [NSURL URLWithString:@"http://f.hiphotos.baidu.com/image/pic/item/1f178a82b9014a901bef674aaa773912b21bee70.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];

        // 2. 完成后更新 UI
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
            [self.imageView sizeToFit];

            self.scrollView.contentSize = image.size;
        });
    });
}
时间: 2024-10-18 00:55:28

GCD 常用代码的相关文章

【swift】BlockOperation和GCD实用代码块

//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @IBOutlet weak var image1: UIImageView! @IBOutlet weak var image2: UIImageView! @IBOutlet weak var image3: UIImageView! @IBOutlet weak var image4: UIIma

常用代码整理(重要)

常用代码整理: 1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATC

HTML入门常用代码

Html 常用代码1.文件类型<HTML></HTML> (放在档案的开头与结尾)2.文件主题<TITLE></TITLE> (必须放在「文头」区块内)3.文头<HEAD></HEAD> (描述性资料,像是「主题」)4.文体<BODY></BODY> (文件本体)5.层<DIV></DIV> 6.层的对齐<DIV ALIGN=LEFT|RIGHT|CENTER|JUSTIFY>

SqlServerDBA 常用代码

--查看partition的四个视图 select * from sys.partition_functions--查看分区函数 select * from sys.partition_parameters select * from sys.partition_range_values--查看分区函数对应的分区范围 select * from sys.partition_schemes--查看分区架构 SqlServerDBA 常用代码,布布扣,bubuko.com

ASP.NET MVC+EF5 开发常用代码

Asp.Net Mvc,EF 技术常用点总结 1.Asp.Net MVC a)获得当前控制器名和当前操作的名称(action) 1.Action 中 RouteData.Values["controller"].ToString(); RouteData.Values["action"].ToString(); 2.页面中(view) ViewContext.RouteData.Values["controller"].ToString().To

js常用代码大全

Javascript常用代码大全 //打开模式对话框 <body><script language=javascript> function doSelectUser(txtId){ strFeatures="dialogWidth=500px;dialogHeight=360px;center=yes;middle=yes ;help=no;status=no;scroll=no"; var url,strReturn; url="selUser.a

Php mysql 常用代码、CURD操作以及简单查询

C/S:Client ServerB/S:Brower Server php主要实现B/S LAMP :Linux系统    A阿帕奇服务器    Mysql数据库   Php语言 mysql常用代码 创建表 1 create table CeShi1 2 ( 3 Uid varchar(50) primary key, 4 Pwd varchar(50), 5 Name varchar(50), 6 Nation varchar(50), 7 foreign key(Nation) refer

一些常用代码

1.地图大于屏幕大小,对camera进行控制,并不是简单地让player一直限制在屏幕中心,而是将player限制在屏幕中间的一个矩形区域内. 1 float rectangleWidth=GameVariables.WIDTH/3; 2 float rectangleHeight=GameVariables.HEIGHT/3; 3 float cameraX=stage.getCamera().position.x; 4 float cameraY=stage.getCamera().posi

网页常用代码(转)

网页制作常用代码(文字颜色/字体/插入图片/flash等) 一:颜色代码如果你想使用某种颜色,取得它的颜色值即可.比如,您想改变某些文字的颜色,您可以使用下面的代码:<font color=#ffc060 size=2>改变#符号后的代码即可改变颜色</font> 000000 000020 000040 000060 000080 0000a0 0000c0 0000ff 008000 008020 008040 008060 008080 0080a0 0080c0 0080f