您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>通讯/手机编程>

iOS中SDWebImage怎么用?

大小:0.3 MB 人气: 2017-09-26 需要积分:1

  由于要监听网络状态,在这里笔者推荐使用AFNetWorking。

  1)在GitHub或者利用cocoaPod给项目导入第三方框架AFNetWorking。

  2)在AppDelegate.m文件中的application:didFinishLaunchingWithOptions:方法中监听网络状态。

  // AppDelegate.m 文件中

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

  {

  // 监控网络状态

  [[AFNetworkReachabilityManager sharedManager] startMonitoring];

  }

  // 以下代码在需要监听网络状态的方法中使用

  AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];

  if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下载原图

  } else { // 其他,下载小图

  }

  }

  这时就会有iOS学习者开始抱怨:这不是很简单吗?于是三下五除二写完了以下代码。

  // 利用MVC,在设置cell的模型属性时候,下载图片

  - setItem:(CustomItem *)item

  {

  _item = item;

  UIImage *placeholder = [UIImage imageNamed:@“placeholderImage”];

  AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];

  if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下载原图

  [self.imageView sd_setImageWithURL:[NSURL URLWithString:item.originalImage] placeholderImage:placeholder];

  } else { // 其他,下载小图

  [self.imageView sd_setImageWithURL:[NSURL URLWithString:item.thumbnailImage] placeholderImage:placeholder];

  }

  }

  此时,确实能完成基本的按照当前网络状态下载对应的图片,但是真实开发中,这样其实是不合理的。以下是需要注意的细节:

  1)SDWebImage会自动帮助开发者缓存图片(包括内存缓存,沙盒缓存),所以我们需要设置用户在WiFi环境下下载的高清图,下次在蜂窝网络状态下打开应用也应显示高清图,而不是去下载缩略图。

  2)许多应用设置模块带有一个功能:移动网络环境下仍然显示高清图。这个功能其实是将设置记录在沙盒中,关于数据保存到本地,可以查看本人另一篇简书首页文章:iOS本地数据存取,看这里就够了。

  3)当用户处于离线状态时候,无法合理处理业务。

  于是,开始加以改进。为了让读者你更容易理解,我先贴出伪代码:

  - setItem:(CustomItem *)item

  {

  _item = item;

  if (缓存中有原图)

  {

  self.imageView.image = 原图;

  } else

  {

  if (Wifi环境)

  {

  下载显示原图

  } else if (手机自带网络)

  {

  if (3G\4G环境下仍然下载原图)

  {

  下载显示原图

  } else

  {

  下载显示小图

  }

  } else

  {

  if (缓存中有小图)

  {

  self.imageView.image = 小图;

  } else // 处理离线状态

  {

  self.imageView.image = 占位图片;

  }

  }

  }

  }

  实现上面的伪代码:读者可以一一对应上面的伪代码。练习的时候推荐先写伪代码,再写真实代码

  多多注意“注释”解释。

  - setItem:(CustomItem *)item

  {

  _item = item;

  // 占位图片

  UIImage *placeholder = [UIImage imageNamed:@“placeholderImage”];

  // 从内存\沙盒缓存中获得原图,

  UIImage *originalImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:item.originalImage];

  if (originalImage) { // 如果内存\沙盒缓存有原图,那么就直接显示原图(不管现在是什么网络状态)

  self.imageView.image = originalImage;

  } else { // 内存\沙盒缓存没有原图

  AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];

  if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下载原图

  [self.imageView sd_setImageWithURL:[NSURL URLWithString:item.originalImage] placeholderImage:placeholder];

  } else if (mgr.isReachableViaWWAN) { // 在使用手机自带网络

  // 用户的配置项假设利用NSUserDefaults存储到了沙盒中

  // [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@“alwaysDownloadOriginalImage”];

  // [[NSUserDefaults standardUserDefaults] synchronize];

  #warning 从沙盒中读取用户的配置项:在3G\4G环境是否仍然下载原图

  BOOL alwaysDownloadOriginalImage = [[NSUserDefaults standardUserDefaults] boolForKey:@“alwaysDownloadOriginalImage”];

  if (alwaysDownloadOriginalImage) { // 下载原图

  [self.imageView sd_setImageWithURL:[NSURL URLWithString:item.originalImage] placeholderImage:placeholder];

  } else { // 下载小图

  [self.imageView sd_setImageWithURL:[NSURL URLWithString:item.thumbnailImage] placeholderImage:placeholder];

  }

  } else { // 没有网络

  UIImage *thumbnailImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:item.thumbnailImage];

  if (thumbnailImage) { // 内存\沙盒缓存中有小图

  self.imageView.image = thumbnailImage;

  } else { // 处理离线状态,而且有没有缓存时的情况

  self.imageView.image = placeholder;

  }

  }

  }

  }

  解决了吗?真正的坑才刚刚开始。

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!