Question

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 wont 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];
}
Was it helpful?

Solution

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)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top