UITableView позволит вам сделать это.В Интернете есть несколько примеров использования UITableView и пользовательских ячеек
. По сути, вы загружаете свои изображения в фоновом режиме и повторно используете ячейки, которые находятся в виде таблицы
РЕДАКТИРОВАТЬ Добавлен пример кода для демонстрации того, как это выполняется.
ВАЖНОЕ ПРИМЕЧАНИЕ
Этот код не был протестирован и может или не может фактически работать как есть.
Он был вставлен с некоторымиредактирование для длины.Я сделал намного больше, чем это, в своем приложении, но в целях соблюдения запрошенного примера я много пропустил.
Продолжаем с примером:
Здесь я получаю ячейку, загружаю ее с предметами, которые легко доступны.И отправьте его в фоновый поток, чтобы загрузить остальные.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"OfferCell";
static NSString *CellNib = @"OfferItem";
OfferCell* cell = (OfferCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
cell = (OfferCell*)[nib objectAtIndex:0];
}
NSDictionary* couponPackage = [self.jsonOfferData valueForKey:@"result"];
NSArray *couponList = [couponPackage valueForKey:@"offers"];
if ([couponList count] >= indexPath.row )
{
NSDictionary* couponData = [couponList objectAtIndex:indexPath.row];
Coupon *coupon = [[Coupon alloc] initWithDictionary:couponData];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:cell,@"cell",coupon,@"coupon", nil];
//Right here you would try to load any cached imaged from disk.
//Then send a Thread to the background to load the image.
[self performSelectorInBackground:@selector(loadTableViewCellData:) withObject:params];
//Load up the rest of the custom info into the custom cell.
[cell.captionLabel setText:coupon.name];
[cell.subTextLabel setText:coupon.subText];
[cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
[cell setCommand:coupon.command];
[cell setParameter:coupon.commandArgs];
[cell setImageURL:coupon.imageURL];
[cell setImageAltURL:coupon.imageAltURL];
[cell setRegistrationCode:coupon.registrationCode];
[coupon release];
}
return cell;
}
, как вы можете видеть, я вызываю фоновый поток, прежде чем даже загружать пользовательский контент в ячейку.
- (void) loadTableViewCellData:(NSDictionary*) objectData
{
OfferCell *cell = [objectData objectForKey:@"cell"];
Coupon *coupon = [objectData objectForKey:@"coupon"];
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[coupon iconURL]]]];
[objectData setValue:image forKey:@"image"];
self performSelectorOnMainThread:@selector(setImageOnMainThread:) withObject:objectData
}
после загрузки изображения я отправляю запрос главного потока для обновления изображения, находящегося в объекте ячейки.
- (void) setImageOnMainThread:(NSDictionary*) objectData
{
OfferCell *cell = [objectData objectForKey:@"cell"];
Coupon *coupon = [objectData objectForKey:@"coupon"];
UIImage *image = [objectData objectForKey:@"image"];
cell.icon.image = image;
}
## ОПЯТЬ Это может не работать на самом деле.##
Я не скопировал весь свой код для этого.это хит, чтобы вы могли понять.
поиграйте с кодом и протестируйте его.но основы есть.
- Удалите из очереди ячейку, которая будет соответствовать вашим потребностям (Идентификатор повторного использования)
- Используйте ячейку, если она может быть dequeue'd или создайте новую с идентификатором повторного использования (в моем примере используютсяxib-файл с именем OfferItem.xib)
- Отправка потока в фоновый режим, который будет загружать данные изображения с диска или URL-адреса (рекомендуется сочетание обоих)
- Отправка потока обратно вПользовательский интерфейс, когда вы готовы загрузить изображение в View (Обновление пользовательского интерфейса должно быть сделано в главном потоке)
, если вы можете сделать это, тогда ваш список друзей (или в этом случае предлагает)будет загружен как можно быстрее.и изображения появятся на экране, как только они загрузятся.
Также, если вы используете технику кэширования, это будет быстрее для последующих загрузок, потому что в первом методе {tableView: cellForRowAtIndexPath:} вы загрузитеКэшированное изображение немедленно.
Кроме этого, это должно довольно быстро загрузить вашу клетку.