2012-01-12 9 views
2

スクロールビューにサブビューを順番に追加する際に問題があります。UIScrollViewにサブビューを順次追加する方法

次のようになりますこれは、私は、ビジネスオブジェクトの配列に解析し、サーバから戻ってくる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()を追加すると、ループ全体が終了してからサブビューが追加されるまで待っています。結果の配列の長さはどのように知ることさえできますか?私は私の知恵の末尾にいる、助けてください。

答えて

0

データを処理するために余分なスレッドを使用していないと仮定します。 あなたが経験することは、アプリケーションがあなたのメソッドを実行していることです。あなたのサブビューを1つずつ追加しても(それらの間にスリープを入れても)、あなたの追加を処理するための他のコードは実行されません。

。別のスレッドを使用してデータをロードし、サブビューを追加することができますが、これはメインスレッドに同期させる必要があります(複雑になります)。

複数のコールでメソッドを中断することができます。あなたのロードメソッドの2つの呼び出しの間に、他のコードが実行され、これはスクロールビューがサブビューを1つずつ処理/表示できることを意味します。

あなたはこのような何かにあなたの読み込み方法を変更する必要があります。


- (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データを更新するとどうなるかを考慮する必要があります。

関連する問題