UITableViewCell AFNetworking 仅加载一次带有动画的图像

Posted

技术标签:

【中文标题】UITableViewCell AFNetworking 仅加载一次带有动画的图像【英文标题】:UITableViewCell AFNetworking load image with animation only once 【发布时间】:2014-10-06 12:46:52 【问题描述】:

当第一次加载图片(通过 URL)时,图片加载应该是动画的。之后,滚动 tableview 不应触发动画。

下面的代码有问题:每当 UITableViewCell 出队时都会触发动画,导致图像从出队的单元格中溶解。如何让动画只触发一次?

[thumbnail cancelImageRequestOperation];
NSURL* imageUrl = [NSURL URLWithString:imageUrlString];
if (imageUrl) 
    [thumbnail setImageWithURLRequest:[NSURLRequest requestWithURL:imageUrl]
                     placeholderImage:placeholderImage
                              success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
                                      [UIView transitionWithView:thumbnail
                                                        duration:0.5f
                                                         options:UIViewAnimationOptionTransitionCrossDissolve
                                                      animations:^thumbnail.image = image;
                                                      completion:nil];

                              
                              failure:nil];

【问题讨论】:

【参考方案1】:

我认为您应该将图像存储为数据源的属性,或者您应该将图像存储在磁盘上。

您必须在完成请求后将图像存储为属性。

if(!obj.image)
NSURL* imageUrl = [NSURL URLWithString:imageUrlString];
if (imageUrl) 
[thumbnail setImageWithURLRequest:[NSURLRequest requestWithURL:imageUrl]
                 placeholderImage:placeholderImage
                          success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
                                  [UIView transitionWithView:thumbnail
                                                    duration:0.5f
                                                       options:UIViewAnimationOptionTransitionCrossDissolve
                                                  animations:^thumbnail.image = image;
                                                  completion:
obj.image = image;
cell.image = obj.image;
];

                          
                          failure:nil];


else

    cell.image = obj.image;

要保存到磁盘,您必须执行相同的操作,只需检查磁盘上是否存在该图像,然后从磁盘设置它或调用下载。

【讨论】:

【参考方案2】:

问题是您永远不会检查该特定行的图像是否已经下载。

无论何时下载图像,都需要将它们保存在success 块中的某个位置(例如NSMutableArray)。在调用setImageWithURLRequest 之前,请检查您的数组以查看该行是否已存在图像。如果是这样,请在本地加载它。如果没有,只有然后调用setImageWithURLRequest

【讨论】:

【参考方案3】:

如果您查看UIImageView+AFNetworking.h,它会在-setImageWithURLRequest:placeholderImage:success:failure: 调用的成功块中明确指出:

如果图像是从缓存中返回的,请求和响应 参数将是nil

只有在请求和响应参数不为 nil 时,您才能使用这个事实来运行动画。

顺便说一句,-setImageWithURLRequest:placeholderImage:success:failure: 实际上设置图像。我不确定您是否需要在动画块中再次执行此操作。

【讨论】:

谢谢。描述还说:如果指定了成功块,则该块负责在返回之前设置图像视图的图像。如果未指定成功块,则应用使用self.image = image 设置图像的默认行为。

以上是关于UITableViewCell AFNetworking 仅加载一次带有动画的图像的主要内容,如果未能解决你的问题,请参考以下文章

AFNetwork、Magical Record和块内保存

AFNetwork 作用和用法详解

Swift 的 AFNetwork [关闭]

很奇怪,包括 AFNetwork 的问题?

AFNetWork网络请求-1016问题

AFNetWork网络请求-1016问题