• OC 线程操作


    - (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;
            });
            
            
        });
        
    }
  • 相关阅读:
    2.6map映照容器
    Gym
    开机提示“该站点安全证书的吊销信息不可用,是否继续?”每次开机都询问
    c++中两个类互相引用的问题
    libconfig 读取配置文件
    内存、硬盘等读取速度
    brpc 使用压缩方式传递数据
    查看系统版本
    C++ 编译出现的错误
    2021-02-06 记录大佬的直播内容
  • 原文地址:https://www.cnblogs.com/qingzZ/p/9229437.html
Copyright © 2020-2023  润新知