Как вы сказали, UITableView повторно использует ячейки, чтобы работать хорошо, поэтому вам необходимо очистить ячейку перед повторным ее использованием, или она будет отображать неправильные данные.
Вы также должны использовать асинхронные вызовы и некоторыеделегирование для обновления ячеек.
Я бы на самом деле взял его на более высокий уровень и использовал бы NSOperationQueue, который позволяет вам устанавливать максимальное количество одновременных загрузок и отменять запросы при выходе из страницы.
Что выВозможно, вы захотите создать помощники данных
@protocol BookDataHelperDelegate <NSObject>
@required
- (void) bookDataHelperDidLoadImage:(BookDataHelper *)dataHelper;
@end
@interface BookDataHelper
@property (nonatomic, retian) UIImage *bookCover;
@property (nonatomic, retain) Book *book;
@property (nonatomic, assign) NSObject<BookDataHelperDelegate> *delegate;
- (void) fetchImageAsynchronouslyFromWebWithDelegate:(NSObject<BookDataHelperDelegate> *)delegate;
@end
Это будет способ перезагрузки данных в вашей таблице
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
CustomCell *cell = [tableView
dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
if (cell == nil)
{
cell = [[[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:SimpleTableIdentifier] autorelease];
}
BookDataHelper *dataHelper = [myArray objectAtIndex:indexPath.row];
if (!dataHelper.bookCover)
{
[cell.imageView setImage:nil];
[dataHelper fetchImageAsynchronouslyFromWebWithDelegate:self];
}
else
{
[cell.imageView setImage:dataHelper.bookCover];
}
cell.bookTitleLabel.text = dataHelper.book.title;
return cell;
}
- (void)bookDataHelperDidLoadImage:(BookDataHelper *)datahelper
{
[tableView reloadDate];
// here you would either reload the table completely
// Or you could reload specific cells
}