Асинхронная загрузка изображения внутри uitableviewcell
Здравствуйте, я пытаюсь использовать EGOImageView внутри CustomTableViewCell, который я сделал для настройки ячейки. Это код, где я использовал EGOImageView.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString* simpleTableIdentifier = @"Albums";
CustomTableCell* cell = (CustomTableCell*)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (!cell)
{
cell = [[CustomTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
NSLog(@"Show once or more times");
}
NSDictionary* dictionary = (NSDictionary*)[self.albumCollection objectAtIndex:indexPath.row];
cell.label.text = [dictionary valueForKey:@"name"];
EGOImageView* imageView = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageWithContentsOfFile:@""]];
[imageView setImageURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=small&access_token=%@", (NSString*)[dictionary valueForKey:@"id"], [[FBSession activeSession] accessToken]]]];
[imageView setFrame:CGRectMake(0.0f,0.0f,78.0f,78.0f )];
[cell.iView addSubview:imageView];
[imageView release];
Изображение на каждой ячейке загружается одним и тем же изображением. Будет ли это потому, что он использовал ячейку при загрузке изображения.
Я нашел проблему, я не могу понять, почему проблема возникла. Я использовал график api, чтобы получить изображение https://graph.facebook.com/%@/picture?type=small&access_token=%@ где первым параметром был идентификатор альбома.
Чтобы мне было легче увидеть проблему, я использовал только один альбом в камере, независимо от того, в каком альбоме я использовал одну и ту же фотографию. Но когда я копирую ссылку в браузер, в адресной строке отображается фактический URL-адрес фотографии с изображением, на котором отображаются правильные фотографии.
Кто-нибудь знает, что было не так.
1 ответ
Вот пример. Он загружает фотографии пользователей с некоторого сервера в фоновом режиме и обновляет изображение ячейки. Обратите внимание, что imageView.image имеет значение nil в начале. Это купол для случая повторного использования ячейки, так что у вас не будет изображения, а не неправильного изображения на время загрузки.
Еще одна вещь, которую нужно добавить, это то, что было бы хорошо иметь кэш, чтобы он не загружал изображения постоянно. Еще одна приятная вещь - не загружать изображения в пограничных сетях.
- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"TransactionCell";
NSMutableArray *data = searching ? searchResult : dataSource;
NSDictionary *object = [data objectAtIndex:[indexPath row]];
UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithIdentifier:CellIdentifier] autorelease];
}
cell.imageView.image = nil;
cell.textLabel.text = @"Your cell text";
NSString *contact = @"foo@gmail.com";
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *imgData = [appDelegate addUserPic:contact];
if (imgData == nil && netStatus == ReachableViaWiFi) {
NSString *url = [NSString stringWithFormat:@"http://somehost.com/userpic/%@", contact];
imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
}
dispatch_async(dispatch_get_main_queue(), ^{
UITableViewCell *updateCell = [self.tableView cellForRowAtIndexPath:indexPath];
if (updateCell) {
if (imgData) {
[appDelegate setUserPic:contact imgData:imgData];
updateCell.imageView.image = [UIImage imageWithData:imgData];
} else {
updateCell.imageView.image = nil;
}
/* This forces the cell to show image as now
it has normal bounds */
[updateCell setNeedsLayout];
}
});
});
return cell;
}