OC 线程操作 - GCD使用 -线程通讯, 延迟函数和一次性代码

- (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;
        });
        
        
    });
    
}

猜你喜欢

转载自www.cnblogs.com/qingzZ/p/9229437.html