Как загрузить изображения в tableView после небольшой задержки? - PullRequest
1 голос
/ 09 апреля 2011

Я видел приложение под названием ZuluTrade, у которого есть диаграммы в ячейках tableView.

Похоже, это изображения в tableViewCell imageView.

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

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

Как можно достичь этой функции?

Вот скриншоты приложения:

enter image description here

enter image description here

Код в моей таблице. cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %i", indexPath.row];

MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
//if (cell == nil) {
    cell = [[[MyTableCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];


    NSString *testVal = [[NSUserDefaults alloc] valueForKey:@"idValue"];

    if (testVal == (NSString *)[NSNull null]) {
        testVal = @"NULL";
    }
    //NSLog(@"testVal : %@",testVal);
NSLog(@"Fund Name : %@",[[array1 objectAtIndex:indexPath.row] valueForKey:@"FundName"]);

    NSDate *date = [NSDate date];
NSDateFormatter *dtFormat = [[NSDateFormatter alloc] init];
[dtFormat setDateFormat:@"yyyy-MM-dd"];
NSString *dtString = [dtFormat stringFromDate:date];

  NSString *fundname = [NSString stringWithFormat:@"%@",[[array1 objectAtIndex:indexPath.row] valueForKey:@"FundName"]];


NSString *imageName =[NSString stringWithFormat:@"%@_%@.png",fundname,dtString]; 
//NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *documentsDirectory = [self getImagePath];
NSLog(@"Image Path : %@",documentsDirectory);
NSError *error1;
NSString *filepath1;
NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:&error1];
if (files == nil) {
    NSLog(@"Error reading contents of documents directory: %@", [error1 localizedDescription]);
}
NSLog(@"FileName: %@",imageName);
BOOL success = NO;
for (NSString *file in files)
{
    NSLog(@"file in Files is %@",file);
    if([file isEqualToString:[NSString stringWithFormat:@"%@",imageName]])
    {
        filepath1 = [documentsDirectory stringByAppendingPathComponent:file];
        NSLog(@"Full Path :%@",filepath1);
        success = YES;
    }
}




    if(success == YES)
    {
        cell.imageView.image = [UIImage imageWithContentsOfFile:filepath1];
    }
    else if(success != YES)
    {
        cell.imageView.image = [UIImage imageNamed:@"newfund.png"];
    }


    UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(60.0, 0, 120.0, 
                                                                tableView.rowHeight)] autorelease]; 
    [cell addColumn:50];
    label.textColor = [UIColor blackColor];
    label.tag = LABEL_TAG; 
    label.font = [UIFont systemFontOfSize:12.0]; 
    //NSLog(@"%@",[[array1 objectAtIndex:indexPath.row] valueForKey:@"FundName"]);
    label.text = [NSString stringWithFormat:@"%@",[[array1 objectAtIndex:indexPath.row] valueForKey:@"FundName"]];
    //NSLog(@"FundName: %@",label.text);
    label.textAlignment = UITextAlignmentCenter; 
    //label.textColor = [UIColor blueColor]; 
    label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | 
    UIViewAutoresizingFlexibleHeight; 
    [cell.contentView addSubview:label];        

return cell;
}

Ответы [ 5 ]

3 голосов
/ 17 апреля 2011

Вы можете добавлять изображения из каталога документов и добавлять их позднее в табличное представление как изображения Lazy Table.

Для этого вы можете использовать следующее

Взгляните на ссылку хранилища SDWebImage ниже.

https://github.com/rs/SDWebImage#readme

Это поможет тебе.

Теперь нужно внести одно небольшое изменение:

[cell.imageView setImageWithURL:[NSURL fileURLWithPath:test1.png]
           placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

вместо

[cell.imageView setImageWithURL:[NSURL URLWithString:test1.png]
           placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

Рад помочь: -)

2 голосов
/ 09 апреля 2011

Когда вы настраиваете ячейку в tableView:cellForRowAtIndexPath:, вы должны проверить, загружено ли изображение (если это так - отображать его оттуда).

И когда загружаются изображения (все или только некоторые из них).их), вы должны вызвать reloadData / reloadRowsAtIndexPaths:withRowAnimation: / reloadSections:withRowAnimation:) вашего табличного представления, чтобы удалить старые сгенерированные ячейки таблицы из кэша.

ОБНОВЛЕНИЕ:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        UIImageView *imgView = [[[UIImageView alloc] init] autorelease];
        imgView.hidden = YES;
        imgView.tag = 5555;
        [cell addSubview:imgView];
    }

    if (nil != _images[indexPath.row]) {
        UIImageView *imgView = (UIImageView *)[cell viewWithTag:5555];
        imgView.image = _images[indexPath.row];
        [imgView sizeToFit];
        imgView.hidden = NO;
    }

    return cell;
}

И _images [] - это контейнер с изображениями для ячеек (указатели UIImage).Я предполагаю, что у нас есть только один раздел, чтобы я мог использовать некоторый простой контейнер в этом примере.Здесь _images [] хранит ноль, если изображение не было загружено, в противном случае - необходим UIImage *.

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

  1. Сохранить изображение для соответствующего индекса _images [].

  2. Вызвать tableView reloadRowsAtIndexPaths:withRowAnimation: для необходимого раздела и строки (из основного потока, конечно).

1 голос
/ 09 апреля 2011

Когда ячейка видна впервые, вызывается метод tablView:cellForRowAtIndexPath: для отображения текста. Отметьте ячейку как видимую. Загрузите изображение с помощью асинхронного потока (подкласс NSOperation). Когда изображение готово для определенной ячейки, отправьте –reloadRowsAtIndexPaths:withRowAnimation: в табличное представление, чтобы загрузить эту конкретную строку из параллельного потока. Я бы не стал использовать reloadData, поскольку это приведет к перезагрузке всех данных в таблице и, вероятно, повлияет на производительность прокрутки.

1 голос
/ 09 апреля 2011

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

[NSThread detachNewThreadSelector:@selector(loadData:) toTarget:self withObject:nil];

Затем в том же классе вам понадобится метод для выполнения работы и обратный вызов.

-(void) loadData:(id)object
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    //do stuff here
    [pool release];
    //Call back
    [self performSelectorOnMainThread:@selector(loadDataComplete:) withObject:nil waitUntilDone:NO];
}


-(void) loadDataComplete:(id)object
{
    // Maybe be more clever and pass the indexPath around so you can just load that row.
    [tableView reloadData]; 
}
0 голосов
/ 23 июля 2012

проверить Пример кода LazyTableImages от Apple

Этот образец демонстрирует многоступенчатый подход к загрузке и отображение UITableView. Он начинается с загрузки соответствующего текста из RSS-канал, чтобы таблица могла загружаться как можно быстрее, а затем загружает изображения для каждой строки асинхронно, поэтому пользовательский интерфейс более отзывчивый.

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