OGImage 0.0.4

OGImage 0.0.4

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

未注册维护。



OGImage 0.0.4

  • Art Gillespie

向后兼容性

请注意,master分支上的0.0.4版本与< 0.0.3版本不兼容。您需要将所有addObserver:调用更改为addObserver:context:,并将removeObserver:改为removeObserver:context:。有关更多信息,请参阅Pull Request 23

介绍

OGImage背后的想法是用简单、可扩展的接口封装HTTP上加载图像的最佳实践。

哲学

  • 默认使用情况应该非常简单易行。在OGImage中,您可以使用以下调用加载、缓存和缩放图像。

      static NSString *KVOContext = @"OGImage observation";
    
      ...
    
      OGScaledImage *ogImage = [[OGScaledImage alloc] initWithURL:imageURL size:renderSize key:nil];
      /*
       * This is shorthand for calling KVO methods for @"image", @"scaledImage", and @"error"
       */
      [ogImage addObserver:self context:&KVOContext];
    
      // check to see if the image loaded instantly (e.g., from cache)
      if (nil != ogImage.image) {
          // we already have an image, so do whatever we need with it, otherwise
          // we'll be notified in `observeValueForKeyPath:ofObject:change:context:` whenever the image changes
          [self displayImage:ogImage.image];
          // ooh, we also got all the image's metadata! Sweet!
          NSDictionary *exifData = [ogImage.originalFileProperties valueForKey:kCGImagePropertyExifDictionary];
      }
  • 网络应属于模型。视图(以及在某种程度上,控制器)不应了解图像的来源:这是模型的工作。OGImage设计为模型对象:控制器和视图通过KVO学习其变化(例如,当图像已加载时)。

  • 通常,最近请求的图像应该有更高的加载优先级。例如,如果图像是在用户滚动表格视图时按需加载的,那么如果他们不需要等待已滚过的所有图像加载,然后再加载可见的图像,那么用户体验会得到改善。同时,我们不相信在表格视图滚动完成后才开始加载图像。OGImage通过将图像加载请求推入LIFO队列来解决这些竞争需求。
  • 每个子系统应拥有自己的GCD队列。

安装

要在项目中使用OGImage,只需将OGImage子目录中的文件添加到目标中。

您需要在目标的“链接二进制与库”构建过程中添加AssetsLibrary.frameworkImageIO.framework。如果您正在使用OGScaledImage和/或OGImageProcessing,您还必须在目标的“链接二进制与库”构建过程中添加Accelerate.frameworkAssetsLibrary.framework

使用

OGImage具有简单的接口;只需使用图像的URL创建实例,并监听image属性上的KVO通知。您还可以指定一个用于加载完成之前的占位图像,使用initWithURL:placeholderImage

#import "OGImage.h"

static NSString *KVOContext = @"OGImage observation";

...

OGImage *image = [[OGImage alloc] initWithURL:[NSURL URLWithString:@"http://somedomain.com/someimage.jpg"]];
[image addObserver:self context:&KVOContext];

...

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ((void *)&KVOContext == context) {
        if ([keyPath isEqualToString:@"image"]) {
            // image was loaded!
            ...
        } else if ([keyPath isEqualToString:@"error"]) {
            // error loading image
        }
    }
    else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

此外,还存在缓存(OGCachedImage)和缓存+缩放(OGScaledImage)子类,它们提供有用的功能,并展示了如何通过子类化来调整OGImage以满足你的需求。

#import "OGScaledImage.h"

static NSString *KVOContext = @"OGImage observation";

...

/*
 * The image at `imageURL` will be loaded from one of in-memory cache, disk cache or
 * over the network and scaled to `scaledSize`. Note that if the image at `imageURL`
 * has already been scaled to `scaledSize` in the past, OGScaledImage will simply
 * load the scaled image from cache.
 */
OGScaledImage *image = [[OGScaledImage alloc] initWithURL:imageURL size:scaledSize key:nil];

/*
 * Note that here we're interested in the `scaledImage` property, not the full-size `image`
 * property.
 */
[image addObserver:self context:&KVOContext];

...

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ((void *)&KVOContext == context) {
        if ([keyPath isEqualToString:@"scaledImage"]) {
            // image was loaded and scaled!
            ...
        } else if ([keyPath isEqualToString:@"error"]) {
            // error loading image
        }
    else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

演示和测试

本仓库包含一个非常简单的项目,演示了如何使用OGScaledImage与标准的UITableView

要运行OGImageDemo项目中的演示和测试,你需要CocoaPods。如果你系统中已经安装了cocoapods,只需从OGImageDemo目录的终端运行pod install

请注意,你不需要在项目中使用cocoapods来使用OGImage—该库没有外部依赖,只有用于测试(GHUnit)和演示(CocoaLumberjack)的依赖项。

键值观察

如果你之前未使用过KVO或对此不够熟悉,请务必查看键值观察编程指南Dave Dribin的杰出作品‘合适的键值观察使用法’

待办事项

请参阅问题