Objective C темы, настройка изображения в iOS tableViewCell - PullRequest
1 голос
/ 24 марта 2011

Я только что начал использовать потоки, и я пытаюсь добиться большей производительности от моего TableView в моем приложении. Каждый tableViewCell имеет imageView, и изображение загружается с диска при создании tableViewCell. Я хочу загрузить изображение в другой поток, а затем установить UIImageView в основном потоке. Мой вопрос, может ли метод, который запускается в другом потоке, вернуть значение в основной поток? Есть ли лучший подход для этого?

Спасибо за любую помощь заранее.

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

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

#define DOCUMENTS_DIRECTORY [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]

//inside - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:indexPath, @"indexPath", @"image1.png", @"imageName", nil];
[NSThread detachNewThreadSelector:@selector(loadIcon:) toTarget:self withObject:d];
//

- (void)iconLoaded:(NSDictionary*)dict {
    [icons replaceObjectAtIndex:[[dict objectForKey:@"index"] intValue] withObject:[UIImage imageWithData:[dict objectForKey:@"imageData"]]];
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[dict objectForKey:@"indexPath"]]];
}
- (void)loadIcon:(NSDictionary*)dict {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *filePath = [DOCUMENTS_DIRECTORY stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.jpg", [dict objectForKey:@"imageName"]]];
    NSData *imageData = [NSData dataWithContentsOfFile:filePath];
    [self performSelectorOnMainThread:@selector(iconLoaded:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:[dict objectForKey:@"indexPath"], "indexPath", imageData, @"imageData", nil] waitUntilDone:YES];


    [pool drain];
}

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

icons - это NSMutableArray, содержащий UIImage для каждой клетки

0 голосов
/ 24 марта 2011

Да, вы можете передавать данные в основной поток.См. Следующий метод в NSObject API docs :

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

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

0 голосов
/ 24 марта 2011

Попробуйте это: https://github.com/foursquare/fully-loaded

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