我在顺序向滚动视图添加子视图时遇到了问题。
我从服务器返回一个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(),它会以某种方式等待整个循环结束,然后才会显示添加的子视图。它怎么知道结果数组有多长?我很有智慧,请帮忙。
答案 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
数据会发生什么。