GCD之全局、主线程

简介:


-(NSString *)fetchData

{

    [NSThread sleepForTimeInterval:1];

    return @"Hello world";

}

-(NSString *)firstCast:(NSString *)data

{

    [NSThread sleepForTimeInterval:2];

    return [data uppercaseString];

}

-(NSString *)secondCast:(NSString *)data

{

    [NSThread sleepForTimeInterval:3];

    return [data stringByReplacingOccurrencesOfString:@"0" withString:@"o"];

}

-(NSInteger)thrid:(NSString *)data

{

    [NSThread sleepForTimeInterval:4];

    return [data length];

     

}


 1.在View中放置一个UIButton按钮和一个UITextView,在按钮点击事件中调用上面的方法

 2.按钮执行方法顺序如下:





- (IBAction)btnclick:(id)sender {

    //__block  声明变量可在block中修改 否则只有只读权限

    __block int a=10;

    NSDate *startTiem=[NSDate date];

    //对于全局队列(并行队列) 声明时第一个参数有三种:四种对应的是不同的全局队列 第二个参数目前未使用 始终为0

    //1.DISPATCH_QUEUE_PRIORITY_DEFAULT

    //2.DISPATCH_QUEUE_PRIORITY_HIGH

    //3.DISPATCH_QUEUE_PRIORITY_LOW    <br>    //4.DISPATCH_QUEUE_PRIORITY_BACKGROUND 


    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

    //dispatch_async 开启异步线程

    dispatch_async(queue, ^{

       NSString *fetchstring= [self fetchData];

       NSString *firststring=[self firstCast:fetchstring];

       NSString *secondstring=[self secondCast:firststring];

       NSInteger length =[self thrid:fetchstring];

       NSDate *endtime=[NSDate date];

       //对于UI的更新获取值都在主线程中 此时要用主线程来更新 主 线程是串行队列

        dispatch_async(dispatch_get_main_queue(), ^{

            self.textview.text=secondstring;

        });

        a=9;//若未在声明变量时使用__block 时将会报错不能编译

       NSLog(@"%@",[NSString stringWithFormat:@"%ld  %@",length,secondstring]);

       NSLog(@"%f",[endtime timeIntervalSinceDate:startTiem]);

    });

} 

3.输出结果

 


相关文章
|
3月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
102 6
|
5月前
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
8月前
|
存储 监控 程序员
线程死锁检测组件逻辑与源码
线程死锁检测组件逻辑与源码
87 2
GCD---从子线程回到主线程(经典用法)
GCD---从子线程回到主线程(经典用法)
138 0
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
1117 1
|
机器学习/深度学习 Java 大数据
函数递归调用的机制|学习笔记
快速学习函数递归调用的机制。
129 0
函数递归调用的机制|学习笔记
|
设计模式 缓存 Java
通过transmittable-thread-local源码理解线程池线程本地变量传递的原理(上)
想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能向预先创建的线程中进行变量传递的局限性,刚好有一位HSBC的技术大牛前同事提到了团队引入了transmittable-thread-local解决了此问题。借着这个契机,顺便clone了transmittable-thread-local源码进行分析,这篇文章会把ThreadLocal和InheritableThreadLocal的局限性分析完毕,并且从一些基本原理以及设计模式的运用分析transmittable-thread-local(下文简称为TTL)整套框架的实现。
166 0
通过transmittable-thread-local源码理解线程池线程本地变量传递的原理(上)
AQS源码探究_06 Conditon条件队列(await方法、线程入队与挂起、signal方法)
AQS源码探究_06 Conditon条件队列(await方法、线程入队与挂起、signal方法)
AQS源码探究_06 Conditon条件队列(await方法、线程入队与挂起、signal方法)
|
Linux 调度 Android开发
【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )(二)
【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )(二)
343 0
|
调度 C++
【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )(一)
【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )(一)
275 0