Как я могу хранить фотографии, если они загружены? - PullRequest
0 голосов
/ 31 декабря 2011

У меня есть UITableViewCell, который содержит 4 фотографии, и я получаю эти фотографии из Интернета, но проблема заключается в том, что когда я прокручиваю вниз UITableView, эти фотографии снова загружаются enter image description here

И это код:

       ITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellPhoto"];

if (cell == nil) {

    NSArray *nibObject = [[NSBundle mainBundle] loadNibNamed:@"CustomCellThumbnails" owner:self options:nil];
    cell = [nibObject objectAtIndex:0];
}

// Get the photos
int getPhotos = indexPath.row * 4;

for (int i = 1; i <= 4; i++) {

    if (getPhotos < [imageArray count]) 
    {
        UIButton *imageButton = (UIButton*)[cell viewWithTag:i];
        NSString *url = [imageArray objectAtIndex:getPhotos];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.siteweb.com%@",url]]];
            UIImage *imageFieldProfile = [[UIImage alloc] initWithData:imageData];
            dispatch_async(dispatch_get_main_queue(), ^{
                // Set the phoyo to the UIButton
                [imageButton setBackgroundImage:imageFieldProfile forState:UIControlStateNormal];
                [imageFieldProfile release];
                // Set the corner of UIButton
                [imageButton.layer setCornerRadius:5.0];
                [imageButton.layer setMasksToBounds:YES];
                imageButton.tag = getPhotos;
            });
        }); 

        [imageButton addTarget:self action:@selector(displayPhoto:) forControlEvents:UIControlEventTouchUpInside];

    }         
    getPhotos ++;
}

Ответы [ 3 ]

1 голос
/ 31 декабря 2011

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

В любом случае, если вам действительно необходимо: инициализируйте UITableViewCell с какой-то таблицей хранения, чтобы вы могли сохранить загруженные данные: переписать initWithStyle:reuseIdentifier: в initWithStyle:reuseIdentifier:usingCacheTable:

Но, опять же, правильный способ сделать это - загрузить данные в контроллер представления и позволить подклассам UIView просто показывать вещи.

0 голосов
/ 01 января 2012

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

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

В отличие от других предложенных решений, Я бы предпочел использовать UITableView и UITableViewCells, так как это позволит вам использовать ячейки из очереди / очереди без необходимости самостоятельно строить такую ​​логику.

Я использовал такое решение для основного приложения в новостном журнале (более 2 миллионов загрузок) и я полностью удовлетворен результатами.

0 голосов
/ 01 января 2012

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

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