【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的详细知识,笔者之后会再进行学习,补充在之后的博客中。

相关推荐
福兮说8 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
茶底世界之下15 小时前
时间线效果层,为什么不能只复用一个处理器?
ios·swift
ZZH_AI项目交付16 小时前
实时字幕负责快,本地录音负责不丢:一个 iOS 录音功能为什么需要两条链路
ios·ai编程
Cc.Y16 小时前
Swift深度链接的极简之道
ios·cocoa·swift
AI砖家17 小时前
iPhone Duo 上架新规:旧 App 怎么兼容,还能不能继续更新?
ios·cocoa·iphone·ios上架·ios上架新规
黑科技iOS上架18 小时前
小蟹iOS混淆:Objective-C项目实战
ios·审核·ios混淆·执行程序差异化
茶底世界之下18 小时前
照片边缘太抢眼?用 Awaking 做一次 1:1 裁切
ios
Digitally18 小时前
如何在iPhone上永久删除文件而无需恢复
ios·iphone
黑科技iOS上架19 小时前
iOS二进制混淆实战:工程级指纹防护彻底解决4.3同质化拒审
ios·审核·ios混淆·执行程序差异化
CocoaKier1 天前
苹果商店详情顶部头图已面向所有开发者开放!
ios·apple