1

メインスレッドにいくつかのUIButtonとUIActivityIndi​​catorsを追加するscrollViewがあります。次に、[NSThread detachSelectorInBackground:@selector(getImages)toTarget:self withObject:nil]を実行します。

getImagesは、いくつかの画像をダウンロードしてUIImageViewsに追加してから、UIImageViewsをscrollViewに追加しますが、getImagesメソッドが完了するまで表示されません。scrollViewを再描画または更新する方法などはありますか?

AND getImagesメソッドの実行中にscrollViewを(指で..)スクロールすると、追加されたUIImageViewsが表示されます。

- (void) getImages {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int x=5;
    int y=0;
    NSData *imgData;
    UIImage *img;
    UIImageView *imgView;
    for (NSDictionary *tmp in thumbs) {

  imgData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[Functions urlForFile:[tmp objectForKey:@"img"]]]];
  if ([imgData length] > 0) {
    img = [[UIImage alloc] initWithData:imgData];
    imgView = [[UIImageView alloc] initWithFrame:CGRectMake(x, y + (133-img.size.height)/2, 100, img.size.height)];

    imgView.image = img;
    [imgView setAlpha:0.0];
    [[self.scrollView viewWithTag:1500000*[[tmp objectForKey:@"id"] intValue]] setAlpha:1.0];
    [self.scrollView addSubview:imgView];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:2.0];
    [[self.scrollView viewWithTag:1500000*[[tmp objectForKey:@"id"] intValue]] setAlpha:0.0];
    [imgView setAlpha:1.0];
    [UIView commitAnimations];
    [[self.scrollView viewWithTag:1500000*[[tmp objectForKey:@"id"] intValue]] removeFromSuperview];      

    [imgView release];
    [img release];
    [imgData release];

    x+=105;
    if (x > 300) {
      x=5;
      y+=138;
    }
  }
}
[pool release];
[appDelegate.loadingView setHidden:YES];
}
4

1 に答える 1

1

バックグラウンドでUIを変更することは、スレッドセーフではありません。バックグラウンドでダウンロードしていますが、表示されていません。performSelectorOnMainThread:@selector() withObject:nil waitUntilDone:YES 画像を1つずつ表示するには、たとえばを使用して画像を実行してみてくださいself.scrollView addSubview:

ただし、UIは常にMainThreadを使用する必要があります(アニメーションなど)

于 2010-12-21T13:21:50.863 に答える