NSData中的图像无法正确加载

时间:2012-02-21 19:53:04

标签: iphone objective-c ios uitableview uiimageview

我正在尝试从服务器中提取的NSData中加载图像并将其显示在自定义UITableViewCell中,但它无法正常工作并且反复重复图像。

Table View

在顶部我们有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,然后重复它们。

有谁知道为什么会这样,为什么?

2 个答案:

答案 0 :(得分:4)

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

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

- (void) connectionDidFinishLoading:(NSURLConnection *)connection
{
    // set the product.image from the response data here

    // reload table
    [self.tableView reloadData];
}

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

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"CellId";

    UICustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
    {
        // create custom cell
        cell = [[[UICustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    }

    Product *product = [products objectAtIndex:indexPath.row];

    cell.textLabel.text = product.name;
    cell.image = product.image;

    return cell;
}

答案 1 :(得分:0)

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

我认为您可能会发现Ray Wenderlich's Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial中的示例非常适合您的目标。我建议你仔细看看这个例子,看看你是否能让它适合你。你可以下载一个样本项目(该页面底部附近的链接),看看它是如何运作的。