gpt4 book ai didi

ios - SDWebImage 在 UITableView 中显示错误的图像

转载 作者:行者123 更新时间:2023-11-29 02:22:50 24 4
gpt4 key购买 nike

在我的 iOS 应用程序中,我在多个 UITableViewCells 中显示图像。但是,它没有在每个单元格中显示正确的图像。

首先,我使用以下方法从 Feedly 流加载一些内容:

- (void)loadStreams {
NSString *feedName = [NSString stringWithFormat:@"%@-id", self.category];

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *accessToken = [standardUserDefaults objectForKey:@"AccessToken"];
NSString *feedId = [standardUserDefaults objectForKey:feedName];
NSString *feedPartial = [feedId stringByReplacingOccurrencesOfString:@"/" withString:@"%2F"];
NSString *feedUrl = [NSString stringWithFormat:@"https://sandbox.feedly.com/v3/streams/%@/contents", feedPartial];

NSLog(@"The Feedly url is: %@", feedUrl);

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:feedUrl]];


NSMutableURLRequest *mutableRequest = [request mutableCopy];
[mutableRequest addValue:accessToken forHTTPHeaderField:@"Authorization"];

request = [mutableRequest copy];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {


NSArray *jsonArray = (NSArray *)[responseObject objectForKey:@"items"];

self.continuation = [responseObject objectForKey:@"continuation"];

NSMutableArray *tempStreams = [[NSMutableArray alloc] init];

for (NSDictionary *dic in jsonArray) {

NSLog(@"Dic contains: %@", dic);

NSDictionary *originArray = [dic objectForKey:@"origin"];
NSDictionary *visualArray = [dic objectForKey:@"visual"];
NSArray *alternateArray = [dic objectForKey:@"alternate"];

NSDictionary *alternate = [alternateArray objectAtIndex:0];

NSString *image = [visualArray objectForKey:@"url"];
NSString *title = [dic objectForKey:@"title"];
NSString *author = [dic objectForKey:@"author"];
NSString *date = [dic objectForKey:@"published"];
NSDictionary *contentum = [dic objectForKey:@"content"];
NSString *content = [contentum objectForKey:@"content"];
NSString *owner = [originArray objectForKey:@"title"];
NSString *givenid = [dic objectForKey:@"id"];
NSString *href = [alternate objectForKey:@"href"];

NSDate *publisher = [NSDate dateWithTimeIntervalSince1970:([date doubleValue] / 1000.0)];
NSString *published = publisher.timeAgoSinceNow;

NSDictionary *data = [[NSDictionary alloc] initWithObjectsAndKeys:title, @"title", image, @"imageurl", published, @"published", owner, @"owner", content, @"content", givenid, @"givenid", href, @"href", author, @"author", nil];

Stream *stream = [[Stream alloc] initWithDictionary:data];
[tempStreams addObject:stream];
}


self.streams = [[NSMutableArray alloc] initWithArray:tempStreams];
tempStreams = nil;

[self.tableView reloadData];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Services"
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
}];

[operation start];
}

这会将数据传递给名为 Stream 的对象,该对象由以下代码组成:

Stream.h

#import <Foundation/Foundation.h>

@interface Stream : NSObject

@property (strong, nonatomic)NSString *name;
@property (strong, nonatomic)NSString *thumbnail;
@property (strong, nonatomic)NSString *photo;
@property (strong, nonatomic)NSString *published;
@property (strong, nonatomic)NSString *content;
@property (strong, nonatomic)NSString *givenid;
@property (strong, nonatomic)NSString *linky;
@property (strong, nonatomic)NSString *author;

- (id)initWithName:(NSString *)aName
thumbnail:(NSString *)aThumbnail
photo:(NSString *)aPhoto
published:(NSString *)aPublished
content:(NSString *)aContent
givenid:(NSString *)aId
linky:(NSString *)aLinky
author:(NSString *)aAuthor;

- (id)initWithDictionary:(NSDictionary *)dic;

@end

流.m

#import "Stream.h"

@implementation Stream

//The designed initializer
- (id)initWithName:(NSString *)aName
thumbnail:(NSString *)aThumbnail
photo:(NSString *)aPhoto
published:(NSString *)aPublished
content:(NSString *)aContent
givenid:(NSString *)aId
linky:(NSString *)aLinky
author:(NSString *)aAuthor{
self = [super init];

if (self) {
self.name = aName;
self.thumbnail = aThumbnail;
self.photo = aPhoto;
self.published = aPublished;
self.content = aContent;
self.givenid = aId;
self.linky = aLinky;
self.author = aAuthor;
}

return self;
}

- (id)initWithDictionary:(NSDictionary *)dic {
self = [self initWithName:dic[@"title"] thumbnail:dic[@"imageurl"] photo:dic[@"imageurl"] published:dic[@"published"] content:dic[@"content"] givenid:dic[@"givenid"] linky:dic[@"href"] author:dic[@"author"]];
return self;
}

- (id)init {
self = [self initWithName:@"Undifined" thumbnail:@"Undifined" photo:@"Undifined" published:@"Undifined" content:@"Undifined" givenid:@"Undifined" linky:@"Undifined" author:@"Undifined"];
return self;
}

@end

最后我构建了一个像这样的单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString * reuseIdentifier = @"programmaticCell";
MGSwipeTableCell * cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if (!cell) {
cell = [[MGSwipeTableCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
}

CGFloat brightness = [UIScreen mainScreen].brightness;

cell.textLabel.text = [self.streams[indexPath.row] name];
cell.detailTextLabel.text = [self.streams[indexPath.row] published];

NSString *imageUrl = [NSString stringWithFormat: @"%@", [self.streams[indexPath.row] photo]];

NSLog(@"Image is: %@ and path is: %d", imageUrl, indexPath.row);

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl]
placeholderImage:[UIImage imageNamed:@"tile-blue.png"] options:indexPath.row == 0 ? SDWebImageRefreshCached : 0];

cell.delegate = self; //optional

return cell;
}

但会发生什么,它会在很多单元格中显示错误的图像,有时会在几个单元格中显示相同的图像。我在这里做错了什么?

最佳答案

这些是细胞重复使用的症状。您必须处理两个问题。

(1) 您应该在重新使用单元格之前重置单元格的内容。为此,您可以覆盖单元格中的 prepareForReuse 并清除相关属性(例如 cell.imageView)。如果您不这样做,您将在 SDWebImage 分配新图像之前看到旧图像 - 在细胞被回收之后。

(2) 由于 SDWebImage 图像检索是异步的,图像可能会在单元格滚出屏幕后到达(并与新内容一起回收。您需要先检查图像是否仍然相关将其分配给 imageView。我不确定 SDWebImage UIImageView 类别方法是否可行。您可能需要稍微剖析一下 SDWebImage。您可以更好地控制使用 SDWebImageManager 方法的过程:

- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
options:(SDWebImageOptions)options
progress:(SDWebImageDownloaderProgressBlock)progressBlock
completed:(SDWebImageCompletionWithFinishedBlock)completedBlock;

你可以像这样使用它(在 CellForRowAtIndexPath 中)

[[SDWebImageManager defaultManager] downloadImageWithURL:url 
options:0
progress:nil
completed:
^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if ([[tableView indexPathForCell:cell] isEqual:indexPath]) {
//image is still valid for this cell
cell.image = image;
}
}];

关于ios - SDWebImage 在 UITableView 中显示错误的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27923625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com