tableview не так отзывчив

#iphone #cocoa-touch #uitableview #asynchronous

#iPhone #cocoa-touch #uitableview #асинхронный

Вопрос:

Мое приложение слишком медленно реагирует, я предполагаю, что я не загружаю изображения асинхронно, но даже если я это делаю, то tableview заставляет мой контроллер загружаться слишком медленно. Код для tableview приведен ниже:

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

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
    UILabel *productNameLbl = [[UILabel alloc] initWithFrame:CGRectMake(83, 8, 200,10)];
        [productNameLbl setFont:[UIFont boldSystemFontOfSize:12.0]];
        [productNameLbl setTag:20];
        [cell.contentView addSubview:productNameLbl];
        [productNameLbl release];


}

else {
    AsyncImageView *oldImage = (AsyncImageView*)[cell.contentView viewWithTag:299];
    [oldImage removeFromSuperview];
}


NSString *baseImageURL = @"http://samplesite.com/";

AsyncImageView* asyncImage = [[[AsyncImageView alloc] initWithFrame:CGRectMake(5, 5, 70, 70)] autorelease];
asyncImage.tag = 299;
NSMutableString *url = [[NSMutableString alloc] initWithString:@""];
NSString *iconUrl = [NSString stringWithString:[[[[[DataCollection sharedObject] categoryProducts ] productsList ]objectAtIndex:indexPath.row] productImage]];

[url appendString:baseImageURL];
[url appendString:iconUrl];
NSURL *imageURL = [NSURL URLWithString:url];
[asyncImage loadImageFromURL:imageURL];
[cell.contentView addSubview:asyncImage];

[(UILabel *) [cell viewWithTag:20] setText:[NSString stringWithString:[[[[[DataCollection sharedObject] categoryProducts ] productsList ]objectAtIndex:indexPath.row] productName]]];
//..... rest of the code
  

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

Комментарии:

1. Хорошее форматирование — ваш друг!

2. Происходит утечка изображения [выбранная ячейка backgroundView:[[Выделение UIImageView] initWithImage: [UIImage imageNamed:@»highlightstrip.png»]]]; Это должно быть: [выбранная ячейка backgroundView: [[Выделение UIImageView] initWithImage: [UIImage imageNamed:@»highlightstrip.png»] авторелиз]] ];

Ответ №1:

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

Или лучше создайте пользовательскую ячейку tabelCell со всеми необходимыми элементами управления.

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

Комментарии:

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

Ответ №2:

Если вы сделаете всю эту часть своего кода aysnc, ваш код был бы очень гладким (хотя учитывайте ваши утечки распределения).

 NSMutableString *url = [[NSMutableString alloc] initWithString:@""];
NSString *baseImageURL = @"http://samplesite.com/";
NSString *imagePath = [NSString stringWithString:[[[[DataCollection sharedObject] popularProducts]objectAtIndex:indexPath.row] productImage]];

[url appendString:baseImageURL];
[url appendString:imagePath];
NSURL *imageURL = [NSURL URLWithString:url];

NSData *data = [NSData dataWithContentsOfURL:imageURL];
UIImage *img = [[UIImage alloc] initWithData:data cache:NO];
UIImageView *imageView = [[UIImageView alloc] initWithImage:img];
[imageView setFrame:CGRectMake(10, 10, 70, 70)];
[cell addSubview:imageView];
[imageView release];
  

Комментарии:

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

2. Я использовал эту библиотеку github.com/hugowetterberg/HBaseLibrary/blob/master / … , но теперь он показывает мне другую ошибку: Неопределенные символы: «_OBJC_CLASS_ $_AsyncImageLoader», ссылка из: objc-class-ref-to-AsyncImageLoader в AsyncImageView.o ld: символ (ы) не найден collect2: ld вернул статус выхода 1 Я не добавил всю библиотеку в свой проект, вместо этого я скопировал только выбранные файлы и файлы ссылок на них тоже. Пожалуйста, скажите мне, как я могу устранить эту ошибку???

3. Очевидно, у вас сложилось впечатление, что код, которым вы поделились, является асинхронным. Все, что я говорю, это то, что это не так. Единственный способ решить эту проблему — создать подкласс ячейки (ну, не единственный способ) и выполнить там асинхронный запрос NSURL и установить изображение после завершения запроса. Это асинхронно. Это просто блокирует основной поток и, таким образом, заставляет вашу таблицу вести себя так, как она есть..

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

Ответ №3:

это было намного проще и действительно решило проблему 🙂http://ezekiel.vancouver.wsu.edu / ~wayne/yellowjacket/YellowJacket.zip

Ответ №4:

У Apple есть проект LazyTableImages, который специально занимается этой проблемой. Возможно, эта модель может вам помочь.