UITableView с огромным количеством изображений - PullRequest
0 голосов
/ 22 апреля 2019

Мое приложение должно отображать огромное количество изображений (около 2000) в UITableView.По сути, я использую следующий код для создания UITableViewCell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    } 

    // Some Operations...

    NSString *path = [self.dataArray jk_objectWithIndex:indexPath.row];
    UIImage *img = [UIImage imageWithContentsOfFile:path];
    cell.imageView.image = img;

    return cell;
}

Это работает, но когда загружается представление таблицы, память быстро увеличивается, и кажется, что все изображения загружаются в память.

Есть ли хорошие идеи для решения этой проблемы?Я просто хочу сохранить память.

Кстати, кто-нибудь знает, каков общий путь для достижения этой потребности?Я думаю, что загрузка всех изображений в память - самый глупый способ ... И код, который я инициализирую в строках таблицы, следующий:


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    if (!_isLoading) {
        return self.dataArray.count; // about 2000... That's terrible
    } else {
        return 0;
    }
}

Спасибо!

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Есть две проблемы с вашим кодом.

  • Во-первых, и самое главное, изображения большие, но отображение изображений в таблице мало,Это неверно.Вы должны загружать изображение только в том размере, который вам необходим для отображения.

  • Во-вторых, изображения кэшируются по умолчанию.Вам необходимо предотвратить кэширование этих изображений при их загрузке.

Вы можете легко сделать обе эти вещи в своем cellForRowAt с помощью каркаса ImageIO.

0 голосов
/ 23 апреля 2019

Я выясняю путь к этому вопросу.Добавьте эти строки кода к cellForRowAtIndexPath:

CGRect rectInTableView = [tableView rectForRowAtIndexPath:indexPath];
    CGRect rectInSuperview = [tableView convertRect:rectInTableView toView:[tableView superview]];
    if ( rectInSuperview.origin.y > SCREEN_HEIGHT || rectInSuperview.origin.y + rectInSuperview.size.height < 0 ) {
        cell.imageView.image = self.placeholder;
    } else {
        NSString *path = [self.dataArray jk_objectWithIndex:indexPath.row];
        UIImage *img = [UIImage imageWithContentsOfFile:path];
        cell.imageView.image = img;
    }

Сначала я проверяю, отображается ли ячейка на экране.Если да, то imageView покажет мои данные изображения.Если нет, то вместо этого показывается заполнитель.Также местозаполнителем является init с [UIImage imageNamed:].Это лучший способ, потому что он будет использоваться часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...