Как добавить подпредставления в UIScrollView последовательно - PullRequest
2 голосов
/ 12 января 2012

У меня проблемы с последовательным добавлением подпредставлений в представление прокрутки.

Я получил ответ JSON с сервера, который я анализирую в массиве бизнес-объектов и отправляю в функциюupdateCarousel, который выглядит следующим образом:

-(void) updateCarousel: (NSArray *)response{
    if(response && response.count>0){
        int i=0;
        self.scrollView.hidden=NO;
        [self.scrollView setNeedsDisplay];
        self.pageControl.hidden=NO;

        [self.scrollView setContentOffset:CGPointMake(0, 0) animated:NO];

        for (Business *business in response){ 
            if (i >= MAX_INITAL_SEARCH_RESULTS)
                 break;

        CGRect frame;
        frame.origin.x = self.scrollView.frame.size.width * i;
        frame.origin.y = 0;

        frame.size = scrollView.frame.size;

        CardView *cardView = [[CardView alloc] initWithBusinessData:business andFrame:frame];


        //I've tried the following code with and without wrapping it in a GCD queue
        dispatch_queue_t addingQueue = dispatch_queue_create("adding subview queue", NULL);
        dispatch_async(addingQueue, ^{
            [self.scrollView addSubview:cardView];
        });
        dispatch_release(addingQueue);

        cardView.backgroundColor = [UIColor colorWithWhite:1 alpha:0];            
        i++;

        self.scrollView.contentSize = CGSizeMake(i*(self.scrollView.frame.size.width), self.scrollView.frame.size.height);
        self.pageControl.numberOfPages=i;

    }
}else{
    self.scrollView.hidden=YES;
    self.pageControl.hidden=YES;
    NSLog(@"call to api returned a result set of size 0");
}

Результат - несмотря на многие вещи, которые я пробовал - всегда один и тот же: scrollView добавляет подпредставления все сразу, а не так, как они обрабатываются в цикле,Я не понимаю, как это возможно.Если я добавлю sleep () в конце цикла, он каким-то образом ожидает завершения всего цикла, прежде чем отобразит подпредставления как добавленные.Как он вообще узнает, какой длины массив результатов?Я в своем уме, пожалуйста, помогите.

1 Ответ

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

Я предполагаю, что вы не используете никаких дополнительных потоков для обработки данных.То, что вы испытываете, - приложение застряло, выполняя ваш метод.Даже если вы добавляете свои подпредставления один за другим (с перерывом между ними), никакой другой фрагмент кода не выполняется для обработки вашего добавления.

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

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

Вам нужно будет изменить метод загрузки на что-токак это:


- (void)updateCarouselStep:(NSNumber*)loadIndex
{
    if (response && response.count > 0)
    {
        // Here add only a subview corresponding to loadIndex


        // Here we schedule another call of this function if there is anything 
        if (loadIndex < response.count - 1)
        {
            [self performSelector:@selector(updateCarouselStep:) withObject:[NSNumber numberWithInt:(loadIndex+1) afterDelay:0.5f];
        }
    }

}


Это только одно из основных решений проблемы.Например, вам необходимо принять во внимание, что произойдет, если вы обновите данные response до того, как завершите загрузку предыдущих.

...