【iOS】SDWebImage的使用

目录

前言

使用方法

与网络申请结合

解决异步


前言

在写知乎日报时,通过接口申请到的网络数据中,有一部分用来表示图片的数据,使用URL表示的,要再次通过URL获取到图片,才能直接使用图片(UIImage),通过SDWebImage第三方库可以很好地解决这个问题,接下来就介绍一下SDWebImage的使用方法。

使用方法

在SDWebImage的官方文档中介绍了很多种使用方法,这里我们介绍其中一种笔者本人在写项目时用到的方法------使用SDWebImageManager

SDWebImage是类别SDWebImageManager背后的类UIImageView(WebCache)。它将异步下载器与图像缓存存储联系起来。您可以直接使用此类,在除 之外的其他环境中UIView(即:使用 Cocoa)利用缓存从 Web 图像下载中获益。

注意:当图片来自内存缓存时,默认情况下不会包含任何图片NSData。但是,如果您需要图片数据,可以传入SDWebImageQueryDataWhenInMemory选项参数。

下面是一个简单的示例:

objectivec 复制代码
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager loadImageWithURL:imageURL
                  options:0
                 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                        // progression tracking code
                 }
                 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
                    if (image) {
                        // do something with image
                    }
                 }];

与网络申请结合

当我们要使用网络申请到的图片时,常常需要先申请到该图片的URL,再用这个URL作为上文方法的参数,再在块中调用获取到的image。

解决异步

这样做会出现的问题是,网络申请数据时是异步进行的,而加载图片也是异步进行的,并且加载图片必须在申请到数据之后,所以我们必须确保执行顺序的正确,我的解决办法是使用两次GCD

objectivec 复制代码
dispatch_group_t group = dispatch_group_create();
    dispatch_group_t imageLoadGroup = dispatch_group_create();
    Manager* manager = [Manager shareManeger];
    dispatch_group_enter(group);
    [manager NetWorkGetWithCompletion:^(NSDictionary * _Nonnull userData, NSError * _Nonnull error) {
        self.homeModel = [HomeModel yy_modelWithDictionary:userData];
        self.topMutableArray = (NSMutableArray*)self.homeModel.top_stories;
        for (int i = 0; i < self.homeModel.top_stories.count; i++) {
            TopSubModel* topSubModel = self.topMutableArray[i];
            NSString* iconURL = topSubModel.image;
            NSURL* URL = [NSURL URLWithString:iconURL];
            SDWebImageManager *manager = [SDWebImageManager sharedManager];
            dispatch_group_enter(imageLoadGroup);
            [manager loadImageWithURL:URL options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
                if (image) {
                    [self.topIconMutableArray addObject:image];
                    NSLog(@"成功");
//                    NSLog(@"xian:%d",self.topIconMutableArray.count);
                } else {
                    NSLog(@"失败");
                }
                dispatch_group_leave(imageLoadGroup);
            }];
        }
        dispatch_group_leave(group);
    }];
    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_group_notify(imageLoadGroup, dispatch_get_main_queue(), ^{
            // 在这里进行视图更新
            HomeView* homeView = [[HomeView alloc] init];
            homeView.topIconNSMutableArray = self.topIconMutableArray;
//            NSLog(@"xianzaitop:%d", homeView.topIconNSMutableArray.count);
            homeView.SubModelMutableArray = self.topMutableArray;
//            NSLog(@"xianzai:%d", homeView.SubModelMutableArray.count);
            [homeView.tableView reloadData];
            [self.view addSubview:homeView];
        });
    });

这样就能确保先申请到网络数据,再加载出图片,再更新UI,就可以成功加载出图片了。

这里笔者还只是知道了在这里GCD的使用方法,关于GCD的详细知识,笔者之后会再进行学习,补充在之后的博客中。

相关推荐
YJlio6 小时前
10.2.8 以其他账户运行服务(Running services in alternate accounts):为什么“把服务切到某个用户账号下运行”,本质上是在改变服务的整个安全上下文?
python·安全·ios·机器人·django·iphone·7-zip
pop_xiaoli9 小时前
【iOS】KVC与KVO
笔记·macos·ios·objective-c·cocoa
90后的晨仔10 小时前
《swiftUI进阶 第10章:现代状态管理(iOS 17+)》
ios
sakiko_20 小时前
UIKit学习笔记4-使用UITableView制作滚动视图
笔记·学习·ios·swift·uikit
小锋学长生活大爆炸1 天前
【开源软件】这次iPhone也是用上Claw了 | PhoneClaw
ios·开源软件·iphone·claw
SameX1 天前
独立开发一个把走过的路变成 km² 的 App,聊聊 25m 网格和后台 GPS 的坑
ios
XD7429716361 天前
科技早报晚报|2026年4月30日:Agent 安全壳、浏览器 iOS 测试台与可穿戴数据 API,今天更值得看的 3 个技术机会
科技·ios·开源项目·科技新闻·开发者工具
北京自在科技1 天前
Find Hub App 小更新
android·ios·安卓·findmy·airtag
2501_915921431 天前
HTTPS前端劫持 新一代流量劫持解决方案
前端·网络协议·ios·小程序·https·uni-app·iphone
911hzh1 天前
Flutter WebRTC iOS 原理解析:从 getUserMedia 到 Texture,讲清视频采集、纹理渲染与远端通话链路
flutter·ios·webrtc