NSThread, UITableViewCell и изображение - PullRequest
0 голосов
/ 14 июня 2011

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

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

Сначала я позвоню ASIHTTPRequest, на мой взгляд, загрузил

Затем в запросе - (void) requestFinished: (ASIHTTPRequest *) я добавлю URL-адрес миниатюры в NSMutableArray

 NSString *photoURLString = [NSString stringWithFormat:@"http://some.url.com/img/%@",[thearray objectForKey:@"tn_url"]];    
[thumbNailURL addObject:(photoURLString)];

А в cellForRowAtIndexPath: где я настраиваю другие данные для отображения, я назову свой NSThread

[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:indexPath];

И в моей ветке loadImage

- (void) loadImage: (NSIndexPath*) indexPath{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *iconURL = [thumbNailURL objectAtIndex:indexPath.row];
NSURL *url = [NSURL URLWithString:iconURL]; 
UIImage *icon = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
cellImageView = [[UIImageView alloc] initWithFrame:CGRectMake(11.0, 6.0, 61.0, 50.0)];
[cellImageView setImage:icon];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell.contentView performSelectorOnMainThread:@selector(addSubview:) withObject:cellImageView waitUntilDone:NO];
[pool drain];

}

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

[1997:7a1f] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 6 beyond bounds [0 .. 5]'    (0x31312d2f 0x345f50e3 0x3127d1b1 0x35aefc1d 0xf4dd 0x333ffb51 0x3347c67b 0x366af589 0x366b2310) terminate called throwing an exceptionProgram received signal:  “SIGABRT”.

Было бы замечательно, если бы кто-нибудь мог показать мне правильную конфигурацию, если я ошибаюсь, поскольку я пробовал разные подходы в течение последних 3 дней. Большое вам спасибо.

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Пара вещей.

Во-первых, я бы порекомендовал вам рассмотреть возможность использования чего-то вроде SDWebImage для асинхронной загрузки изображений (похоже, Оливье Пуатье - автор оригинала).Github репозиторий здесь: https://github.com/rs/SDWebImage. Я использую его именно для этой цели, и это здорово.

Тем не менее, я вижу несколько вещей здесь.

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

2) Я не могу сказать из кода здесь, но вы должны быть уверены, что вы этого не делаетеразрешить представлению таблицы загружать данные до тех пор, пока не будет вызван после вызова requestFinished.В противном случае вы получите состояние гонки, которое может привести к типу ошибки, которую вы видите.Попробуйте установить источник данных tableView в методе requestFinished, а затем вызвать reloadData.В противном случае, сделайте так, как предложено, и просто заполните массив URL объектами [NSNull null].

0 голосов
/ 14 июня 2011

Пытались ли вы, чтобы массив «thumbNailURL» содержал объекты [NSNull null] для количества элементов, которые вы пытаетесь отобразить, а затем заменял их после загрузки их асинхронно, так что вы не можете быть быстрее массива.

thumbNailURL = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < [items count]; i++) {
    [thumbNailURL addObject:[NSNull null]];
}

Тогда просто:

[thumbNailURL replaceObjectAtIndex:index withObject:thumbnail];
...