UITableView iPhone с плавной прокруткой, с изображениями - PullRequest
1 голос
/ 20 февраля 2011

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

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

Есть ли уроки для NOOB?!?


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

Как это можно остановить?

Любая помощь будет оценена.

NSString *userImage = [(Tweet*)[profile objectAtIndex:indexPath.row]  profileImage];
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSData* imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:[(Tweet*)[profile objectAtIndex:indexPath.row]  profileImage]]];          
            dict =[[NSMutableDictionary alloc]init];
                //UIImage *retImage =[dict  objectForKey:(@"%@", userImage)];
                UIImage *retImage =[dict  objectForKey:userImage];
                dispatch_async(dispatch_get_main_queue(), ^{
                        if (!retImage) {
                        UIImage *profileImage=[UIImage imageWithData:imageData];
                        [dict setObject:profileImage forKey:userImage];
        }
                    UIImage *retImage2 =[dict  objectForKey:userImage];
                    photo.image = retImage2;


                        [imageData release];
                        });

Ответы [ 4 ]

5 голосов
/ 20 февраля 2011

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

Apple предоставила образец для того же.

Пожалуйста, посмотрите на Ленивая загрузка TableViewCells

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

РЕДАКТИРОВАТЬ: Если вы не знаете, или не хотите использовать потоки, то есть другой альтернативный вариант для этого. Проверь это: загрузка-изображения-для-таблицы-без резьбы

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

[решено] я добавил оператор if, он не оптимален, но он запаздывает, если изображение не существует.

                    if (!image) {
                    [activityIndicator startAnimating];
                        UIImage *phoneImage=[UIImage imageWithData:[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:userImage]]];
                        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                                                             NSUserDomainMask, YES);
                        NSString *documentsDirectory = [paths objectAtIndex:0];
                        NSString* path = [documentsDirectory stringByAppendingPathComponent:
                                          [NSString stringWithFormat:@"%@:%@", imageName, fileName]  ];
                        NSData* data = UIImagePNGRepresentation(phoneImage);
                        [data writeToFile:path atomically:YES];
                                            }               
                else{
                    photo.image=image;
                    [activityIndicator stopAnimating];
                }
0 голосов
/ 20 февраля 2011

Загрузите изображения в фоновом потоке, и когда изображения станут доступны, установите их в UIImageView в ячейке табличного представления. Вы останавливаете основной поток с загрузкой ваших изображений по сети.

0 голосов
/ 20 февраля 2011

Насколько велики ваши изображения?Вы можете уменьшить их, прежде чем помещать в tableView.

что-то вроде:

    #define kImageSize 44 
   // Create a thumbnail version of the image for the oject.
CGSize size = newImage.size;
CGFloat ratio ;
if (size.width > size.height) {
        ratio = kImageSize / size.width;
} else {
    ratio = kImageSize/ size.height;
}
CGRect rect = CGRectMake(0.0, 0.0, ratio * size.width, ratio * size.height);

if (NULL != UIGraphicsBeginImageContextWithOptions) { //test that function is available
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);  //allow iphone4 to use higher-res
} else {
    UIGraphicsBeginImageContext(rect.size);
}
[newImage drawInRect:rect];
userThumbnailImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Кроме того, я отмечаю, что каждый раз, когда ваше изображение находится в словаре, вы будете снова сохранять;вы, вероятно, хотите вернуть строку кэширования в предложение (! photo.image).

...