我创建了一个自定义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
方法),以便重新绘制图像视图。
您可以将UITableViewCell
或UITableView
作为delegate
传递给AsyncUIImgeView
,以便它可以告诉表视图重新加载该单元格。