SecondExample 2.0.2

SecondExample 2.0.2

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2017年9月

fangqingmei维护。



  • 作者:
  • fangqingmei

网络图片

Dependency Status Reference Status

本库为UIImageView提供了支持从网页获取远程图片的分类。

它提供了:

  • 一个将网络图片和缓存管理添加到Cocoa Touch框架中的UIImageView分类
  • 异步图片下载
  • 异步内存+磁盘图片缓存,带有自动缓存过期处理
  • 支持动画GIF
  • 支持WebP格式
  • 后台图像解压缩
  • 确保相同的URL不会被下载多次
  • 确保无效的URL不会被反复重试
  • 确保不会阻塞主线程
  • 性能优秀!
  • 使用GCD和ARC
  • 支持Arm64

注意:SDWebImage的3.8版本需要iOS 7或更高版本(由于NSURLSession)。3.7到3.0版本需要iOS 5.1.1。如果您需要iOS < 5.0的支持,请使用最后一个2.0版本

SDWebImage相比X如何更优秀?

谁在使用它

了解谁在使用SDWebImage并将其应用程序添加到列表中。

如何使用

API文档可在CocoaDocs - SDWebImage中找到

在UITableView中使用UIImageView+WebCache分类

只需导入UIImageView+WebCache.h头文件,并在UITableView的dataSource方法tableView:cellForRowAtIndexPath:中调用sd_setImageWithURL:placeholderImage:方法。从异步下载到缓存管理,所有操作都将为您自动处理。

#import <SDWebImage/UIImageView+WebCache.h>

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"MyIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:MyIdentifier] autorelease];
    }

    // Here we use the new provided sd_setImageWithURL: method to load the web image
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                      placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

    cell.textLabel.text = @"My Text";
    return cell;
}

使用blocks

使用blocks,您可以收到图片下载进度通知,并且在图片检索成功或失败时也会收到通知

// Here we use the new provided sd_setImageWithURL: method to load the web image
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                      placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                             completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                                ... completion code here ...
                             }];

注意:如果您在完成之前取消了图片请求,则成功和失败block均不会被调用。

使用SDWebImageManager

SDWebImageManager是UIImageView+WebCache分类背后的类。它将异步下载器与图像缓存存储器相连接。您可以直接使用此类,在其他上下文中(例如Cocoa)受益于具有缓存的Web图片下载。

以下是使用SDWebImageManager的一个简单示例

SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadImageWithURL: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
                         }
                     }];

独立使用异步图像下载器

也可以独立地使用异步图像下载器

SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
[downloader downloadImageWithURL:imageURL
                         options:0
                        progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                            // progression tracking code
                        }
                       completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
                            if (image && finished) {
                                // do something with image
                            }
                        }];

独立使用异步图像缓存

也可以独立使用基于异步的图像缓存存储。SDImageCache维护一个内存缓存和可选的磁盘缓存。磁盘缓存写入操作是异步的,因此不会给UI添加不必要的延迟。

SDImageCache类提供了一个单例实例以方便使用,但如果你想创建独立的缓存命名空间,可以创建自己的实例。

要查找缓存,你使用queryDiskCacheForKey:done:方法。如果该方法返回nil,则表示缓存目前不拥有该图像。因此,你需要负责生成和缓存它。缓存键是缓存的图像的唯一标识符,通常是图像的绝对URL。

SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"];
[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) {
    // image is not nil if image was found
}];

默认情况下,SDImageCache将在内存缓存中找不到图像时查找磁盘缓存。你可以通过调用备用方法imageFromMemoryCacheForKey:来阻止这种情况发生。

要将图像存储到缓存中,你使用storeImage:forKey:方法

[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];

默认情况下,该图像将被存储在内存缓存以及磁盘缓存(异步)。如果你想只在内存缓存中存储,请使用带有负第三个参数的备用方法storeImage:forKey:toDisk:

使用缓存键过滤器

有时,你可能不希望使用图像URL作为缓存键,因为URL的一部分是动态的(例如:用于访问控制)。SDWebImageManager提供了一种设置缓存键过滤器的方式,该过滤器输入NSURL,并输出一个缓存键NSString。

以下示例在应用程序代理中设置了一个过滤器,该过滤器在将其用作缓存键之前会从URL中删除任何查询字符串

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
        url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
        return [url absoluteString];
    };

    // Your app init code...
    return YES;
}

常见问题

使用UITableViewCell动态图像大小

UITableView通过为单元格设置的第一个图像集来确定图像的大小。如果你的远程图像与占位图像的大小不相同,你可能会有奇怪的失真缩放问题。以下文章提供了一种解决这个问题的方法

http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/

处理图像刷新

SDWebImage默认执行非常积极的缓存。它忽略HTTP服务器返回的所有类型的缓存控制头,并将返回的图像无时间限制地缓存。这意味着你的图像URL是静态URL,指向永远不改变图像。如果指向的图像发生变化,URL的某些部分应该相应地更改。

如果你无法控制你使用的图像服务器,你可能无法更改当其内容更新时的URL。例如,这是Facebook头像URL的情况。在这种情况下,你可以使用SDWebImageRefreshCached标志。这会略微降低性能,但会尊重HTTP缓存控制头。

[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
                 placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                          options:SDWebImageRefreshCached];

添加进度指示器

请参阅以下分类:https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage

安装

有三种方法可以将SDWebImage用于你的项目

  • 使用CocoaPods
  • 将所有文件复制到您的项目
  • 将项目导入为静态库

Podfile

platform :ios, '7.0'
pod 'SDWebImage', '~>3.8'

如果您正在使用 Swift,请确保添加 use_frameworks! 并将目标设置为 iOS 8+

platform :ios, '8.0'
use_frameworks!

子规格

目前有3个子规格可供选择: CoreMapKitWebP(这意味着您可以只安装 SDWebImage 的一些模块。默认情况下,您仅得到 Core,因此如果您需要 WebP,您需要指定它)。

Podfile 示例

pod 'SDWebImage/WebP'

Cartfile

github "rs/SDWebImage"

使用方法

Swift

如果您使用 CocoaPods 安装

import SDWebImage

如果您手动安装

import WebImage

Objective-C

@import WebImage;

通过克隆存储库进行安装

为了访问存储库中的所有文件,您应该克隆它。

git clone --recursive https://github.com/rs/SDWebImage.git

将 SDWebImage 项目添加到您的项目中

  • 下载页面下载和解压框架的最新版本
  • 在项目导航器上右键单击,然后选择“将文件添加到 '您的项目'”
  • 在对话框中,选择 SDWebImage.framework
  • 勾选“将项目添加到目标组的文件夹中(如果需要)”复选框

添加依赖项

  • 在应用程序项目 app 的目标设置中,找到“构建阶段”部分,并打开“与库链接”块
  • 单击"+"按钮再次并选择"ImageIO.framework",这是渐进式下载功能所需的

添加链接器标志

打开“构建设置”选项卡,在“链接”部分中,找到“其他链接器标志”设置并添加"-ObjC"标志

Other Linker Flags

或者,如果您使用 Cocoa Pods 并且有任何扩展可选库的框架,例如 Parse、RestKit 或 opencv2,并且这导致编译问题,请使用而不是-ObjC标志

-force_load SDWebImage.framework/Versions/Current/SDWebImage

如果您使用 Cocoa Pods 并有任何扩展可选库的框架,例如 Parsen RestKit 或 opencv2,请使用而不是-ObjC标志

-force_load $(TARGET_BUILD_DIR)/libPods.a

并使用此

$(inherited)

将头文件导入到您的源文件中

在您需要使用库的源文件中,导入头文件

#import <SDWebImage/UIImageView+WebCache.h>

构建项目

此时,您的 workspace 应该可以在没有错误的情况下构建。如果遇到问题,请在 Issue 中发布,社区可以帮您解决问题。

未来改进

  • LRU 内存缓存清理而不是内存警告时重置

许可证

所有源代码均根据MIT 许可证授权。