0

我正在使用 Twitter API 创建一个应用程序并使用 JSON 进行解析,每次我将图像加载到单元格中时,它都会拍摄多张图像并且一切运行缓慢。我将如何继续获取图像然后将相同的图像放入所有单元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"TweetCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];


NSString *text = [tweet objectForKey:@"text"];
NSString *time = [tweet objectForKey:@"created_at"];
time = [time stringByReplacingOccurrencesOfString:@" +0000 "withString:@"/"];


NSString *twitterImage = [[tweet objectForKey:@"user"] objectForKey:@"profile_image_url_https"];
NSString *completeImage = [NSString stringWithFormat:@"%@", twitterImage];
NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: completeImage]];
imageLabel.image = [UIImage imageWithData: imageData];
cell.imageView.image = [UIImage imageWithData: imageData];


cell.textLabel.text = text;
cell.textLabel.numberOfLines = 3;
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", time];
  }
return cell;
}

现在看起来像这样,但当我滚动时真的很迟钝。 http://gyazo.com/8ab8325f3921fdb7e4f0ea0107d389ac.png

4

4 回答 4

1

在我看来,问题出在以下几行:

NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];

NSString *twitterImage = [[tweet objectForKey:@"user"] objectForKey:@"profile_image_url_https"];

我相信这是为每个单元格获取图像的新副本。每个 indexPath.row 都是一条新推文,因此您将获得多个 twitterImage

于 2013-05-23T16:12:15.523 回答
0

您面临的问题是因为您正在下载主线程上的所有图像。

要解决这个问题:

  1. 使用 NSOperationQueue 使用单独的线程下载图像。一个很好的教程:http ://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

  2. 使用此类“AsyncImageView”。我用过这个,它工作正常。因此,您需要使用类 AsyncImageView 而不是 UIImageView,并且该库将为您异步管理下载。
    https://github.com/nicklockwood/AsyncImageView

于 2014-01-01T11:00:06.023 回答
0

如果始终是同一张图片,请在表加载之前在类参数中加载它(例如在 中viewDidLoad)并始终使用此参数。

如果它是动态的,请使用performSelectorInBackground.

于 2013-05-23T16:08:23.250 回答
0

您应该对图像使用缓存。我希望这个链接可以帮助你:

http://khanlou.com/2012/08/asynchronous-downloaded-images-with-caching/

于 2013-05-23T18:55:10.800 回答