Ленивая загрузка отображает в UITableView

Нет никакого понятия "интерфейса" по сути в C++. AFAIK, интерфейсы были сначала представлены в Java для работы вокруг отсутствия множественного наследования. Это понятие оказалось довольно полезным, и тот же эффект может быть достигнут в C++ при помощи абстрактного базового класса.

абстрактный базовый класс является классом, в котором по крайней мере одна функция членства (метод в малопонятном жаргоне Java) является чистой виртуальной функцией, объявил использование следующего синтаксиса:

class A
{
  virtual void foo() = 0;
};

абстрактный базовый класс нельзя инстанцировать, т.е. Вы не можете объявить объект класса A. Можно только получить классы из A, но любой производный класс, который не обеспечивает реализацию foo(), также будет абстрактен. Чтобы прекратить быть абстрактным, производный класс должен обеспечить реализации для всех чистых виртуальных функций, которые он наследовал.

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

И, как Mark Ransom указал, абстрактный базовый класс должен обеспечить виртуальный деструктор, точно так же, как любой базовый класс, в этом отношении.

58
задан jszumski 3 May 2013 в 15:19
поделиться

2 ответа

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

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

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

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

Вы также можете рассмотреть возможность публикации некоторого кода.

-1
ответ дан 24 November 2019 в 19:10
поделиться

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

Это класс, который я написал для загрузки изображений:

- (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url {
    if(self = [super init]) {
        if(url == nil || [url isEqualToString:@""])
            return nil;
        target = trgt;
        action = sel;
        imgURL = [[NSURL alloc] initWithString: url];
    }
    return self;
}

- (void)main {
    [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
}

- (void)loadImage {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    UIImage *img = [UIImage imageNamed: @"default_user.png"];
    if(![[imgURL absoluteString] isEqualToString: @"0"]) {
        NSData *imgData = [NSData dataWithContentsOfURL: imgURL];
        img = [UIImage imageWithData: imgData];
    }
    if([target respondsToSelector: action])
        [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES];
    [pool release];
}

- (void)dealloc {
    [imgURL release];
    [super dealloc];
}

Надеюсь, это поможет!

3
ответ дан 24 November 2019 в 19:10
поделиться