2. GCD的使用(线程间通信---子线程执行耗时操作/主线程更新UI)

本文介绍如何在iOS应用开发中利用Swift语言,通过线程间通信技术实现网络图片的异步加载,并在主线程中更新UI元素,以提升用户体验和应用响应速度。重点展示了使用dispatch_async函数在全局队列和主队列中交替执行任务,确保应用流畅运行的同时,有效处理网络请求带来的阻塞问题。

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

//
//  ViewController.m
//  07-线程间通信(加载图片,在主线程中更新UI)
//
//  Created by Jasperay on 15/9/3.
//  Copyright (c) 2015年 @aLonelyRoot3. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIButton *button;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
}


// 加载网络图片的方法
- (UIImage *)loadImageWithUrl:(NSString *)urlStr {

//  URL: 同一资源定位符.定位唯一资源
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
    NSData *data = [NSData dataWithContentsOfURL:url];
    
    UIImage *img = [UIImage imageWithData:data];
    
    return img;
}


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

//  1.在子线程下载图片
    
//  首先, 需要开启新的线程, 需要使用异步函数
    
//  然后, 并发任务都可以放在全局并发队列, 而UI操作放在主队列
    
    
//  因此可以使用(异步函数 + 全局并发队列) 内部嵌套 一个(异步函数 + 主队列)的形式-----常用
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSString *urlStr = @"http://img1a.xgo-img.com.cn/pics/1538/a1537491.jpg";
        UIImage *img = [self loadImageWithUrl:urlStr];
        

//  2.在主线程更新UI
//      此时回到主线程,更新UI(给button设置背景图)
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.button setBackgroundImage:img forState:UIControlStateNormal];
        });
    });

}


@end

 

转载于:https://www.cnblogs.com/chnyang/p/4780267.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值