开发者

Adding UIImageView to UIScrollView in background Thread, wont show up until all are added

开发者 https://www.devze.com 2023-01-31 20:03 出处:网络
I have a scrollView where I add some UIButtons and UIActivityIndicators in the main thread. Then I perform a [NSThread detachSelectorInBackground:@selector(getImages) toTarget:self withObject:nil];

I have a scrollView where I add some UIButtons and UIActivityIndicators in the main thread. Then I perform a [NSThread detachSelectorInBackground:@selector(getImages) toTarget:self withObject:nil];

getImages downloads some images and add them into UIImageViews and then adds the UIImageViews to the scrollView, but they won开发者_运维技巧t show up until the method getImages is done. Is there any way to get the scrollView to redraw or refresh or something like that?

AND If I scroll the scrollView (with my fingers..) during the getImages method, the UIImageViews that has been added shows up.

- (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];
}


changing the UI in background is not thread-safe! Downloading in background but not displaying. To show an image one by one you can try to run it with performSelectorOnMainThread:@selector() withObject:nil waitUntilDone:YES for example with self.scrollView addSubview:.

But again, UI should always use MainThread (e.g. animations)

0

精彩评论

暂无评论...
验证码 换一张
取 消