如何按顺序将子视图添加到UIScrollView

时间:2012-01-12 19:46:55

标签: ios asynchronous uiscrollview addsubview

我在顺序向滚动视图添加子视图时遇到了问题。

我从服务器返回一个JSON响应,我将其解析为一个Business对象数组,然后发送到函数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 :(得分:0)

我假设您没有使用任何额外的线程来处理数据。 您遇到的是应用程序执行您的方法时遇到的问题。即使您逐个添加子视图(在它们之间有睡眠),也不会执行任何其他代码来处理您的添加。

<强> 1 即可。您可以使用另一个线程来加载数据并添加子视图,但这需要与主线程同步(更复杂)。

2 您可以在多个通话中断开您的方法。在两次调用load方法之间,允许执行其他代码段,这意味着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数据会发生什么。