来自 NSData 的图像未正确加载

Posted

技术标签:

【中文标题】来自 NSData 的图像未正确加载【英文标题】:Images from NSData Not Loading Correctly 【发布时间】:2012-02-21 19:53:03 【问题描述】:

我正在尝试从NSData 加载从服务器拉取的图像,并在自定义UITableViewCell 中显示它们,但它无法正常工作,并且一遍又一遍地重复图像。

在顶部我们有indexPath.row = 0,从那里向上。当单元加载时,它会调用以下代码来加载图像(使用 NSLog 时会为每个图像返回正确的 URL),因此它似乎正在下载正确的图像。

- (void) startLoadingImage

    NSString *url = @"myurlhere";
    url = [url stringByAppendingFormat:identifier];
    NSLog(@"Image URL: %@", url); //THIS IS WHERE I DETERMINE THAT IT IS DOWNLOADING THE CORRECT IMAGE
    NSURLRequest * request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
    NSURLConnection * imageConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [imageConnection start];

当服务器返回NSData 时,单元格使用委托方法...

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

    if (!rawData) rawData=[[NSMutableData alloc]initWithLength:0];
    [rawData appendData:data];

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

    NSLog(@"Image did finish loading. Displaying...");

    [productImage setImage:[[UIImage alloc]initWithData:rawData]];

它可以正常加载四个图像,然后开始重复图像(尽管单元格中的名称和价格等信息确实显示正确)。这意味着您会一遍又一遍地看到牛仔裤的照片,每四个单元格。

这是我的NSLog 输出。再一次,看起来一切都是正确的。

2012-02-21 14:45:01.152 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00084@2x.jpg
2012-02-21 14:45:01.173 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00085@2x.jpg
2012-02-21 14:45:01.199 APPNAME[7873:11f03] Image did finish loading. Displaying...
2012-02-21 14:45:01.205 APPNAME[7873:11f03] Image did finish loading. Displaying...
2012-02-21 14:45:11.064 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00086@2x.jpg
2012-02-21 14:45:11.476 APPNAME[7873:11f03] Image did finish loading. Displaying...
2012-02-21 14:45:12.432 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00089@2x.jpg
2012-02-21 14:45:12.751 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00080@2x.jpg
2012-02-21 14:45:13.010 APPNAME[7873:11f03] Image did finish loading. Displaying...
2012-02-21 14:45:13.013 APPNAME[7873:11f03] Image did finish loading. Displaying...
2012-02-21 14:45:14.574 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00081@2x.jpg
2012-02-21 14:45:14.948 APPNAME[7873:11f03] Image did finish loading. Displaying...

如你所见,它正在加载图像 84、85、86、89、80、81,但它只显示图像 84、85、86、89,然后重复它们。

有谁知道为什么会发生这种情况以及为什么?

【问题讨论】:

对我来说这似乎是一个单元重用问题。 【参考方案1】:

UITableView 重用您创建的UITableViewCell 对象(通过dequeueReusableCellWithIdentifier: 方法)。您不应直接修改 UITableViewCell 对象。而是重新加载表格数据,然后更新 tableView:cellForRowAtIndexPath: 委托方法中的单元格。

在你的视图控制器中,你会有这样的东西:

- (void) connectionDidFinishLoading:(NSURLConnection *)connection // 从这里的响应数据中设置 product.image // 重新加载表 [self.tableView reloadData];

重新加载数据将刷新您的表格单元格,这将调用您的委托方法:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 静态 NSString *cellIdentifier = @"CellId"; UICustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 如果(单元格 == 零) // 创建自定义单元格 cell = [[[UICustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; 产品 *product = [产品 objectAtIndex:indexPath.row]; cell.textLabel.text = 产品名称; 细胞.图像=产品.图像; 返回单元格;

【讨论】:

而实际上,在connectionDidFinishLoading中,如果你知道刚刚加载完图片的cell的索引路径,就可以在那个索引路径处重新加载cell。【参考方案2】:

如果没有看到您的所有代码,我认为您在将其作为异步连接处理时可能会遇到问题。我看不到您如何将任何特定单元绑定到连接请求。

我认为您可能会发现Ray Wenderlich's Multithreading and Grand Central Dispatch on ios for Beginners Tutorial 中的示例非常适合您似乎正在做的事情。我建议你仔细查看这个例子,看看你是否可以让它为你工作。您可以下载示例项目(该页面底部附近的链接)并自己查看它是如何工作的。

【讨论】:

以上是关于来自 NSData 的图像未正确加载的主要内容,如果未能解决你的问题,请参考以下文章

在网站加载但未正确加载的图像(已损坏)

NSData 未在 UIWebView lodadata 方法中正确加载

ImageNet 数据集图像未正确加载

未加载颤振图像(例外:解析图像编解码器)

iPhone保存的png在我加载回来后不一样了

从 NSData 获取较低质量的 UIImage?