Предварительная загрузка дополнительного изображения на примере Apple PhotoScroller - PullRequest
0 голосов
/ 14 августа 2011

Я пытаюсь изменить пример Apple PhotoScroller и столкнулся с проблемой, которую не смог решить.

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

Чтобы повысить производительность, я хотел предварительно загрузить следующую страницу, чтобы пользователю не нужно было ждать загрузки изображения при прокрутке на следующую страницу. Как только следующая страница появится на текущей странице, будет загружена следующая страница и т. Д. ...

Я не совсем уверен, как мне этого добиться, и я надеюсь, что кто-то покажет мне, что делать.

Вот мой пользовательский код: (Пожалуйста, обратитесь к полному коду из примера Apple PhotoScroller)

Метод tilePage: (Он будет вызываться в начале и каждый раз, когда пользователь прокручивает scrollView)

- (void)tilePages 
{
// Calculate which pages are visible
CGRect visibleBounds = pagingScrollView.bounds;
int firstNeededPageIndex = floorf(CGRectGetMinX(visibleBounds) / CGRectGetWidth(visibleBounds));
int lastNeededPageIndex  = floorf((CGRectGetMaxX(visibleBounds)-1) / CGRectGetWidth(visibleBounds));
firstNeededPageIndex = MAX(firstNeededPageIndex, 0);
lastNeededPageIndex  = MIN(lastNeededPageIndex, [self imageCount] - 1);

// Recycle no-longer-visible pages 
for (ImageScrollView *page in visiblePages) {
    if (page.index < firstNeededPageIndex || page.index > lastNeededPageIndex) {
        [recycledPages addObject:page];
        [page removeFromSuperview];
    }
}
[visiblePages minusSet:recycledPages];


// add missing pages
for (int index = firstNeededPageIndex; index <= lastNeededPageIndex; index++) {


    if (![self isDisplayingPageForIndex:index]) {

        ImageScrollView *page = [self dequeueRecycledPage];
        //ImageScrollView *nextpage = [self dequeueRecycledPage];

        if (page == nil) {
            page = [[[ImageScrollView alloc] init] autorelease];
        }

        [self configurePage:page forIndex:index];
        [pagingScrollView addSubview:page];
        [visiblePages addObject:page];

    }
}   

}

Чтобы настроить индекс страницы и содержимое:

- (void)configurePage:(ImageScrollView *)page forIndex:(NSUInteger)index
{   
//set page index
page.index = index;

//set page frame
page.frame = [self frameForPageAtIndex:index];

//Actual method to call image to display
[page displayImage:[self imageAtIndex:index]];  
NSLog(@"index: %i", index);
}

Чтобы получить изображение с URL:

- (UIImage *)imageAtIndex:(NSUInteger)index {

NSString *string1 = [NSString stringWithString:@"http://abc.com/00"];
NSString *string2 = [NSString stringWithFormat:@"%d",index+1];
NSString *string3 = [NSString stringWithString:@".jpg"];

NSString *finalString = [NSString stringWithFormat:@"%@%@%@",string1,string2,string3];
NSLog(@"final string is: %@", finalString);

NSURL *imgURL = [NSURL URLWithString: finalString];
NSData *imgData = [NSData dataWithContentsOfURL:imgURL];

return [UIImage imageWithData:imgData];

}

Спасибо за помощь! Лоуренс

1 Ответ

0 голосов
/ 14 февраля 2012

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

Проблема с большими изображениями заключается в том, что даже если вы сохраняете их в файловой системе, существует время запуска для получения изображений. Кроме того, в PhotoScroller Apple «обманывает», предварительно настроив все изображения для каждого уровня детализации. Apple не предоставляет никакого способа для рендеринга простого JPEG-файла в PhotoScroller, поэтому, если вы не можете предварительно создать плитку, он будет бесполезен для вас.

Если вам интересно, вы можете увидеть, как загрузить несколько изображений и предварительно поместить их во временный файл, просмотрев проект PhotoScrollerNetwork на github.

...