- (void)touchesBegan:(NSSet<UITouch *> *)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; }); }); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现