Ios 带有图像缓存的表视图和;拉动以更新";选项

Ios 带有图像缓存的表视图和;拉动以更新";选项,ios,uitableview,three20,Ios,Uitableview,Three20,几乎每个ios应用现在都有类似“Feed”的选项。 编程通常包括从网络上获取图像、缓存图像、处理页面、“拉到更新选项”等等——所有这些都是标准的东西 但看起来没有标准的解决方案 我尝试了“三个20”-非常大,有许多模块的复杂库。它确实缺少好的文档!在从缓存中获取图像时,它也会“减速” 也许我应该为每个小任务分别使用不同的小库?例如,自我、自我等 还是不使用任何库,从头开始编写所有内容更好 请在这里给我一些关于最佳实践的建议,我现在真的被卡住了。很容易访问以获取更新 对于图像加载,我为UIIm

几乎每个ios应用现在都有类似“Feed”的选项。 编程通常包括从网络上获取图像、缓存图像、处理页面、“拉到更新选项”等等——所有这些都是标准的东西

但看起来没有标准的解决方案

  • 我尝试了“三个20”-非常大,有许多模块的复杂库。它确实缺少好的文档!在从缓存中获取图像时,它也会“减速”

  • 也许我应该为每个小任务分别使用不同的小库?例如,自我、自我等

  • 还是不使用任何库,从头开始编写所有内容更好

请在这里给我一些关于最佳实践的建议,我现在真的被卡住了。

很容易访问以获取更新

对于图像加载,我为UIImageView编写了以下类别:

// .h
@interface UIImageView (UIImageView_Load)
- (void)loadFrom:(NSURL *)url completion:(void (^)(UIImage *))completion;
@end

// .m
#import "UIImageView+Load.h"
#import <QuartzCore/QuartzCore.h>

@implementation UIImageView (UIImageView_Load)

- (void)loadFrom:(NSURL *)url completion:(void (^)(UIImage *))completion {

    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        if (data) {
            self.image = [UIImage imageWithData:data];
            if (completion) completion(self.image);
        }
    }];
}

@end

// To use it when building a cell

//...

MyModelObject *myModelObject = [self.myModel objectAtIndex:indexPath.row];
if (myModelObject.image) {
    cell.imageView.image = myModelObject.image;
} else {
    NSURL *url = [NSURL urlWithString:myModelObject.imageUrl];
    [cell.imageView loadFrom:url completion:^(UIImage *image) {
        // cache it in the model
        myModelObject.image = image;
        cell.imageView.image = image;
    }];
}

// ...
/.h
@接口UIImageView(UIImageView\u加载)
-(void)loadFrom:(NSURL*)url完成:(void(^)(UIImage*)完成;
@结束
//m
#导入“UIImageView+Load.h”
#进口
@实现UIImageView(UIImageView\u加载)
-(void)loadFrom:(NSURL*)url完成:(void(^)(UIImage*)完成{
NSURLRequest*request=[nsurlRequestRequestWithURL:url];
[NSURLConnection sendAsynchronousRequest:请求队列:[NSOperationQueue mainQueue]完成处理程序:^(NSURLResponse*响应,NSData*数据,NSError*错误){
如果(数据){
self.image=[UIImage imageWithData:data];
if(完成)完成(自映像);
}
}];
}
@结束
//在构建单元时使用它
//...
MyModelObject*MyModelObject=[self.myModelObjectAtIndex:indexath.row];
if(myModelObject.image){
cell.imageView.image=myModelObject.image;
}否则{
NSURL*url=[NSURL urlWithString:myModelObject.imageUrl];
[cell.imageView加载自:url完成:^(UIImage*图像){
//将其缓存在模型中
myModelObject.image=图像;
cell.imageView.image=图像;
}];
}
// ...

我是Leah Culver库的粉丝,这个库处理拉刷新以及无休止的向下滚动


要加载图像,请尝试DailyMotion应用程序。

谢谢您的回答,@danh!不幸的是,它没有包括任何缓存解决方案。但我会尝试一下leah的“提神”游戏。@Danik-当然。我粘贴的代码进行了延迟加载,并在回调的模型中缓存。是的,我现在明白了,您可以将其缓存在myModelObject.image中!你是清除didReceiveMemoryWarning上的缓存还是限制它的最大大小?我会删除整个模型,从而删除缓存图像的内存警告。我不限制大小,不过它是一个合理的扩展,可以在模型中提供一个图像获取程序,该程序还可以记录时间,并提供一个“清理”程序来处理非最近的图像。我主张将图像保留在模型中,这样当其他视图访问模型时,它们就“在那里”。(也不需要传递缓存)。谢谢!我还使用Leah的Pull为我当前的项目刷新和SDWebImage。