我创建了一个自定义UITableViewCell,它由2个UILabel和一个UIImageView组成。

与单元格关联的数据可通过名为CellInfo的NSObject类获得。 CellInfo具有2个NSString类型的属性和一个UIImage属性。

当我在initWithData方法(CellInfo类)内部创建CellInfo实例时,请执行以下操作:

if(self = [super alloc])
{
  //initialize strings variables
  self.name = aName;
  self.descritpion = aDescription;
  [self grabImage]
}
return self;


其中使用ASIHTTPrequest框架以异步方式抓取图像的CellImage(在CellInfo类中)(在下面的代码中,NSURL总是一样的,但实际上它随数据而变化)

- (void)grabImage
{
   NSURL *url = [NSURL URLWithString:@"http://myurl.com/img.png"];
   __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

   [request setCompletionBlock:^{

      NSData *data = [request responseData];
      UIImage* img = [[UIImage alloc] initWithData:data];

      self.image = img;
      [img release];

      // Send a notification if image has been downloaded
      [[NSNotificationCenter defaultCenter] postNotificationName:@"imageupdated" object:self];
   }];
   [request setFailedBlock:^{
      NSError *error = [request error];
     // Set default image to self.image property of CellInfo class
   }];
   [request startAsynchronous];
}


我还有一个UITableViewController,它将数据加载到自定义单元格中,如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Do stuff here...

    // Configure the cell...
    ((CustomTableViewCell*)cell).nameOutlet.text = ((CellInfo*) [self.infoArray objectAtIndex:indexPath.row]).name;
    ((CustomTableViewCell*)cell).descriptionOutlet.text = ((CellInfo*) [self.infoArray objectAtIndex:indexPath.row]).descritpion;
    ((CustomTableViewCell*)cell).imageViewOutlet.image = ((CellInfo*) [self.infoArray objectAtIndex:indexPath.row]).image;

    return cell;
}


令人沉迷的是,此UITableViewController观察到CellInfo类的通知,因为在启动时,不显示可见单元的图像。这是捕获通知时调用的方法:

- (void)imageUpdated:(NSNotification *)notif {

    CellInfo * cInfo = [notif object];
    int row = [self.infoArray indexOfObject:cInfo];
    NSIndexPath * indexPath = [NSIndexPath indexPathForRow:row inSection:0];

    NSLog(@"Image for row %d updated!", row);

    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]  withRowAnimation:UITableViewRowAnimationNone];
}


该代码运行良好,但是我想知道我做得对还是有更好的方法来做到这一点。
我的怀疑是:将下载的图像保存在每个CellInfo实例中是否正确,或者是否可以采用另一种方法来使用例如ASIHTTPRequest提供的缓存策略来缓存图像?

附言如果已经下载了特定CellInfo实例的图像,则不调用handleImage。

最佳答案

我相信那很整洁。取而代之的是,您可以子类化UIImageView类,并创建一个类似[AsyncUIImageView initWithURL:]的初始化程序,然后将该ASIHttpRequest逻辑放入视图中。

完成图片加载后,可能有两种方法:


它可以调用[self setNeedsDisplay]UIView方法),以便重新绘制图像视图。
您可以将UITableViewCellUITableView作为delegate传递给AsyncUIImgeView,以便它可以告诉表视图重新加载该单元格。

10-06 09:02