线程间的通信 iOS

本文介绍了在iOS开发中如何从其他线程回到主线程以更新UI,涉及了使用NSThread和GCD两种方法。通过示例代码详细展示了如何在子线程下载图片并在主线程中显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从其他线程回到主线程的方法

我们都知道在其他线程操作完成后必须到主线程更新UI。所以,介绍完所有的多线程方案后,我们来看看有哪些方法可以回到主线程。

  • NSThread

    //Objective-C
    [self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:NO];
    
    //Swift
    //swift 取消了 performSelector 方法。
  • GCD

    //Objective-C
    dispatch_async(dispatch_get_main_queue(), ^{
    
    });
    
    //Swift
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
    
    })

    线程之间的通信

    我们在iOS开发中使用多线程一般使用这几种,NSThread,GCD,NSOperation;
    我们多在自线程中进行数据加载或者下载的操作,所以总免不了将获取到的数据发送到主线程进行显示或者进行操作,下面就是我们经常使用基本的线程之间的通信;
     项目的准备工作:
         1.新建一个Xcode项目,在storybo
    ard中创建一个image View,并设置约束和image view控件的大小,
    关联到viewController的( @property (weak, nonatomic) IBOutlet UIImageView *imageview;)属性;
         2.在子线程下载的图片,然后显示到image view上;
     
    第一种:NSThread

     

    复制代码
    -(void)thread{
        // 创建一个字符串
        NSString *str = @"http://www.xiami.com/images/collect/802/2/10023802_1330239346.jpg";
        [self performSelectorInBackground:@selector(loadImage:) withObject:str];
    }
    
    -(void)loadImage:(NSString *)str{
       
        NSURL *url = [NSURL URLWithString:str];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
       
        NSLog(@"loadImage----->%@",[NSThread currentThread]);
        /**
         *      这个方法回到主线程并且执行
         *  @param updateUI: 执行更新ui的方法
         */
        [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO];
    }
    -(void)updateUI:(UIImage *)image{
        self.imageview.image = image;
       
    }
    复制代码

    触发thread方法,performSelectorInBackground:withObject: ---->方法开启一个子线程,在子线程中执行  loadImage: 的方法,在loadImage中下载图片,然后调用performSelectorOnMainThread:withObject;回到主线程,在updateUI中将下载好的图片赋值给imageView;

     
    第二种:GCD
    复制代码
    //调用gcd
    -(void)gcd{ NSString *str = @"http://www.xiami.com/images/collect/802/2/10023802_1330239346.jpg";
    //在下面这个block使用self会形成循环引用,使用__weak修饰weakSelf,可以放置循环引用; //控制器对block有一个强引用,如果在block中使用self的话,block也对控制器有一个强引用; __weak typeof(self) weakSelf = self; /** * 开启一个异步任务, * 获取一个全局队列,在全局队列中下载图片 * 开启一个异步任务,在这个异步任务中获取一个主队列,在主队列中更新ui; */ dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSURL *url = [NSURL URLWithString:str]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; dispatch_async(dispatch_get_main_queue(), ^{ weakSelf.imageview.image = image; }); }); }

    
    
    
    
    
    
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值