NSThread实现线程间通信

线程通信
  1. 什么是线程间通信?
  • 在1个进程中,线程往往不是孤立存在的,多个线程之间需要进行通信。
    -线程通信之间的体现
    • 1个线程传递数据给另一个线程
    • 在一个线程中执行完特定任后,转到另一个线程继续执行任务

例如:线程A需要线程B的一个结果,线程b将数据传递给线程A,这种两个线程之间交互数据的过程,就是线程通信;可到官方文档《线程编程指南》查看线程通信

NSThread线程间通信常用方法

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait子线程调用该方法则回到主线程

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait使用哪个线程执行
最典型的案例,是在线图片显示,一个子线程下载图片,下载完成后回到主线程显示
代码示例如下:

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSThread *downloadThread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage) object:nil];
    [downloadThread start];
}
-(void)showImag:(UIImage *)image{
    if (image) {
        self.imageView.image=image;
    }
}
-(void)downloadImage{
    NSString *imageUrlStr=@"https://t7.baidu.com/it/u=139984722,3523412696&fm=193&f=GIF";
    NSURL *url = [NSURL URLWithString:imageUrlStr];
    NSError *error=nil;
    NSData *data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached
 error:&error];
    UIImage *image=nil;
    if (!error) {
        image=[UIImage imageWithData:data scale:[UIScreen mainScreen].scale];
    }
    //    [self performSelectorOnMainThread:@selector(showImag:) withObject:image waitUntilDone:YES];
    //使用imageView可省略一步写showImage:方法
    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
    NSLog(@"%f",end-start);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值