У меня есть UITableView
, который будет содержать большое количество изображений.Как эффективно загружать изображения в UITableView?
В каждой ячейке будет 5 изображений, которые будут загружены случайно с сайта Parse.com.
Код запроса, прямо сейчас, находится в cellForRowAtIndexPath
.
Это вызывает несколько вопросов:
1.) Там некоторое отставание/задержки при прокрутке таблицы.
2.) Изображения, теперь по какой-то нечетной причине, не отображаются в нужном месте.
3.) Изображения перезагружаются/меняются каждый раз, когда прокручивается таблица.
Я хотел бы, чтобы изображения были загружены только один раз, когда на этом UIView
, в нужном месте и с плавной прокруткой.
Каков наилучший способ справиться с этим?
Вот код, как я загрузки изображения:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// set up the cell here
// query and display random images from parse.com
PFQuery * query = [PFUser query];
[query whereKey:@"category" equalTo:self.cell.label.text];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (error)
{
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
else
{
for (int i = 0; i < objects.count; i++)
{
self.profilePicObject = [objects objectAtIndex:i];
int imgRandom = arc4random() % [objects count];
self.randomProfilePicObject = [objects objectAtIndex:imgRandom];
self.imageFile = [self.randomProfilePicObject objectForKey:@"imageFile"];
NSURL * imageFileURL = [[NSURL alloc] initWithString:self.imageFile.url];
NSData * imageData = [NSData dataWithContentsOfURL:imageFileURL];
UIImage * aImage = [[UIImage alloc] initWithData:imageData];
self.cell.profilePicOne.image = aImage;
}
}
return self.cell;
}
EDIT:
Я использую SDWebImage и теперь таблица прокручивается плавно и изображения отображения.
Новый номер:
Изображения загружаются в неправильных клеток.
Я запрашиваю таблицу и сопоставляю текст ярлыка с соответствующей строкой в таблице Parse и использую ее для отображения правильного изображения.
Первоначально некоторые изображения загружаются в правильную ячейку, а некоторые нет.
Когда я прокручиваю, изображения появляются повсюду.
Каков наилучший способ исправить это?
Вот как я устанавливаю вверх клетки:
static NSString * cellIdentifier = @"FilterSelectCell";
self.cell = (FilterSelectCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (self.cell == nil)
{
NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"FilterSelectCell" owner:self options:nil];
self.cell = [nib objectAtIndex:0];
self.cell.profilePicOne.clipsToBounds = YES;
self.cell.profilePicOne.layer.cornerRadius = 20.0;
self.cell.profilePicTwo.clipsToBounds = YES;
self.cell.profilePicTwo.layer.cornerRadius = 20.0;
self.cell.profilePicThree.clipsToBounds = YES;
self.cell.profilePicThree.layer.cornerRadius = 20.0;
self.cell.profilePicFour.clipsToBounds = YES;
self.cell.profilePicFour.layer.cornerRadius = 20.0;
self.cell.profilePicFive.clipsToBounds = YES;
self.cell.profilePicFive.layer.cornerRadius = 20.0;
}
self.cell.label.text = [self.myArray objectAtIndex:indexPath.row];
Вы можете предварительно загрузить некоторые случайные изображения, однако многие из которых, по вашему мнению, понадобятся в -viewDidLoad. Почему отложить это до тех пор, пока они не понадобятся? Кроме того, вы можете (и в значительной степени) загружать изображения в фоновом режиме, используя что-то вроде NSURLConnection или SDWebImage. – Josh