请注意,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,只需将OGImage
子目录中的文件添加到目标中。
您需要在目标的“链接二进制与库”构建过程中添加AssetsLibrary.framework
和ImageIO.framework
。如果您正在使用OGScaledImage
和/或OGImageProcessing
,您还必须在目标的“链接二进制与库”构建过程中添加Accelerate.framework
和AssetsLibrary.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的杰出作品‘合适的键值观察使用法’
请参阅问题