没有缓存的Afnetworking离线模式(保存到文件中像Android中的Imageloader)

时间:2014-11-19 08:44:36

标签: ios objective-c afnetworking

我想使用afnetworking方法下载并将图像显示到imageview中。

另一个步骤是我想在离线模式下用户打开应用程序时保存所有图像。

有一篇关于SO的文章给出了如何在url标头中使用UrlCache和缓存变量的方法。

在android中开发的背景是否有任何方法可以让Afnetworking像Imageloader一样工作

在Android中的解决方案? (将文件保存到程序或文档文件夹中并在离线模式下恢复)

这是我在uicolleciotn视图中显示图像的代码:

    if (![appRecord.thumb_url isEqualToString:@""])
    {

        [myCell.imageView setImageWithURL:[NSURL URLWithString:appRecord.thumb_url] placeholderImage:[UIImage imageNamed:@"white.png"]];
        __weak UIImageView *weakImageView = myCell.imageView;
        NSURLRequest *request1 = [NSURLRequest requestWithURL:[NSURL URLWithString:appRecord.thumb_url]];
        [myCell.imageView setImageWithURLRequest:request1
                    placeholderImage:[UIImage imageNamed:@"white.png"]
                             success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
                                 UIImageView *strongImageView = weakImageView; // make local strong reference to protect against race conditions
                                 if (!strongImageView) return;

                                 [UIView transitionWithView:strongImageView
                                                   duration:0.3
                                                    options:UIViewAnimationOptionTransitionFlipFromRight
                                                 animations:^{
                                                     strongImageView.image = image;
                                                 }
                                                 completion:NULL];
                             }
                             failure:NULL];

    }

由于 luvacu 建议后更改代码:

将此添加到标题:

@property (nonatomic, strong) NSURLRequest *strongRequest1;

和:

        __block UIImageView *weakImageView = myCell.imageView;
        NSURLRequest *request1 = [NSURLRequest requestWithURL:[NSURL URLWithString:appRecord.thumb_url]];
        __block NSURLRequest *weakRequest1 = request1;
        [myCell.imageView setImageWithURLRequest:request1
                                placeholderImage:[UIImage imageNamed:@"white.png"]
                                         success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
                                             UIImageView *strongImageView = weakImageView; // make local strong reference to protect against race conditions
                                             if (!strongImageView) {
                                                 return;
                                             }

                                             [UIView transitionWithView:strongImageView
                                                               duration:0.3
                                                                options:UIViewAnimationOptionTransitionFlipFromRight
                                                             animations:^{
                                                                 strongImageView.image = image;
                                                             }
                                                             completion:NULL];
                                         }
                                         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                                             NSURLRequest *strongRequest = weakRequest1;
                                              UIImageView *strongImageView = weakImageView;
                                             UIImage *cachedImage = [[UIImageView sharedImageCache] cachedImageForRequest:strongRequest];
                                             if (cachedImage) {
                                                 [UIView transitionWithView:strongImageView
                                                                   duration:0.3
                                                                    options:UIViewAnimationOptionTransitionFlipFromRight
                                                                 animations:^{
                                                                     strongImageView.image = cachedImage;
                                                                 }
                                                                 completion:NULL];
                                             }
                                         }];
在程序离线后仍然没有任何影响。

1 个答案:

答案 0 :(得分:1)

AFNetworking的类别UIImageView+AFNetworking包含每个图像URL请求的NSCache。当请求失败时,尝试为该请求加载缓存的图像。

    __block UIImageView *weakImageView = myCell.imageView;
    NSURLRequest *request1 = [NSURLRequest requestWithURL:[NSURL URLWithString:appRecord.thumb_url]];
    __block NSURLRequest *weakRequest1 = request1;
    [myCell.imageView setImageWithURLRequest:request1
                            placeholderImage:[UIImage imageNamed:@"white.png"]
                                     success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
                             UIImageView *strongImageView = weakImageView; // make local strong reference to protect against race conditions
                             if (!strongImageView) {
                                 return;
                             }

                             [UIView transitionWithView:strongImageView
                                               duration:0.3
                                                options:UIViewAnimationOptionTransitionFlipFromRight
                                             animations:^{
                                                 strongImageView.image = image;
                                             }
                                             completion:NULL];
                         }
                         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                             NSURLRequest *strongRequest = weakRequest1;
                             UIImage *cachedImage = [[UIImageView sharedImageCache] cachedImageForRequest:strongRequest]
                             if (cachedImage) {
                                 [UIView transitionWithView:strongImageView
                                               duration:0.3
                                                options:UIViewAnimationOptionTransitionFlipFromRight
                                             animations:^{
                                                 strongImageView.image = cachedImage;
                                             }
                                             completion:NULL];
                             }
                         }];

此外,您正在加载图像两次。删除第一个:

[myCell.imageView setImageWithURL:[NSURL URLWithString:appRecord.thumb_url] placeholderImage:[UIImage imageNamed:@"white.png"]];