博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC 线程操作 - GCD使用 -线程通讯, 延迟函数和一次性代码
阅读量:6208 次
发布时间:2019-06-21

本文共 2810 字,大约阅读时间需要 9 分钟。

- (void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event{// [self downImage];// [self delay]; [self once]; [self once]; [self once];}/** 一次性代码: 整个应用程序只会执行一次 不可以放在懒加载里面, 如果在类中使用一次性代码, 创建的第二个对象, 就完全不会初始化, static : 全局变量 */-(void)once{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"---once---"); });}/** 常用函数 : 延迟方法 */-(void)delay{ NSLog(@"----start----"); /** 参数1:(nonnull SEL) 方法名字 参数2:(nullable id) 传递参数 参数3:(NSTimeInterval) 时间 */ //1. 只在主线程执行 [self performSelector:@selector(task) withObject:nil afterDelay:2]; //2.定时器方法 只在主线程执行 [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(task ) userInfo:nil repeats:YES]; //3.GCD 可以在主线程和子线程执行 /** 参数1:DISPATCH_TIME_NOW 现在开始计算时间 参数2:延迟时间 2.0 GCD 时间单位:纳秒 NSEC_PER_SEC 1000000000ull 参数3:(NSTimeInterval) 时间 */ // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{// [self task];// }); dispatch_queue_t queue = dispatch_get_main_queue(); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), queue, ^{ [self task]; }); dispatch_queue_t global_queue = dispatch_get_global_queue(0, 0); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), global_queue, ^{ [self task]; }); }- (void)task{ NSLog(@"---task---%@", [NSThread currentThread]);}//线程间通讯 - 各种嵌套-(void)downImage{ //1. 创建异步函数, 这里只有一个任务,用并发和串行都可以 // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // // }); dispatch_async(dispatch_get_global_queue(0, 0), ^{ //1.1确定URL NSURL *url = [NSURL URLWithString:@"http://www.leawo.cn/attachment/201309/4/756352_1378261981fNNT.png"]; //1.2下载二进制数据到本地 NSData *data = [NSData dataWithContentsOfURL:url]; //1.3转换图片 UIImage *image = [UIImage imageWithData:data]; // [self.iv performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]; // [self.iv performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO]; // dispatch_async(dispatch_get_main_queue(), ^{ // NSLog(@"=====%@", [NSThread currentThread]); // self.iv.image = image; // }); //这里不会死锁, 因为这个任务是在子线程里 创建的, dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"=====%@", [NSThread currentThread]); self.iv.image = image; }); }); }

 

转载于:https://www.cnblogs.com/qingzZ/p/9229437.html

你可能感兴趣的文章
社保医院
查看>>
织梦调用自定义字段
查看>>
java动态代理小记
查看>>
基于信息安全技术的电子病案管理
查看>>
MongoDB 3.0新增特性一览
查看>>
Nokia N900 通过flasher刷机教程
查看>>
软件级负载均衡器(LVS/HAProxy/Nginx)的特点简介和对比
查看>>
写在前面
查看>>
js改变背景
查看>>
《MS SQL Server 2000管理员手册》系列——22. 建立及使用触发程序
查看>>
我的友情链接
查看>>
Docker源码分析(三):Docker Daemon启动
查看>>
Converting circular structure to JSON
查看>>
dhcp协议的工作流程
查看>>
POSIX中无名信号量
查看>>
date加一天的几种方式
查看>>
我的友情链接
查看>>
jmeter简单压力post接口问题
查看>>
JAVA如何使用泛型编程
查看>>
asp.net中几种下载方式
查看>>