Question

This code generates Low memory warning because background 5 thread is almostly loading images in same time.

I want to give a priority each thread and make lock & unlock. I would make step by step thread. image 1 loading -> image2 loading -> image3 loading -> image4 loading.

How can I do this?

viewcontroller

-(void)viewDidLoad
{            
 for(int i=0; i<screenshotcount ; i++)
 {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
    NSString * url=[detailItem.mScreenshot objectAtIndex:i];
    NSDictionary *args=[NSDictionary dictionaryWithObjectsAndKeys:
                       [NSNumber numberWithInt:i], @"screenNum",
                       [NSString stringWithString:url],@"url",
                       nil];
    [self performSelectorInBackground:@selector(loadImageScreenshot:) withObject:args];
    [pool release]; 
  }
}

loading image

-(void) loadImageScreenshot:(NSDictionary *) args
{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
 UIImage * screenshotImage=[UIImage imageWithStringURL:url];
 NSDictionary *args2=[NSDictionary dictionaryWithObjectsAndKeys:
                    [NSNumber numberWithInt:num], @"screenNum",
                    screenshotImage,@"image",
                    nil];                                                               

[self performSelectorOnMainThread:@selector(assignImageToScreenshotImageView:) withObject:args2  waitUntilDone:YES];
[pool release];
}

image add

- (void) assignImageToScreenshotImageView:(NSDictionary *)arg
{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage * image= [arg objectForKey:@"image"];
UIImageView *imageview=[UIImageView alloc]init];
               .
               .
imageview.image=image;
[self.mScreenshotSpace addSubview:imageview];
[imageview release];
[pool release];
}

image from url

+(UIImage *)imageWithStringURL:(NSString *)strURL
{
 NSURL *url =[NSURL URLWithString:strURL];
 NSData *   data=[[NSData alloc]initWithContentsOfURL:url options:NSDataReadingUncached error:&error];

 UIImage * image=[UIImage imageWithData:data ];
 [data release];
 return image;
}
Was it helpful?

Solution

maybe I misunderstood your question, but from what you said, what you really want is to "serialise" the threads, that is, ensure they are executed one after the other. If this is the case I do not see a big advantage in having five (or more) threads if they spend most of the time waiting in a sort of "thread queue" :)
My 2 cents: Instead of playing with the threads' priority, maybe you should think about re-design the code to have a queue of files/images to load and a thread that dequeue and load the images one after the other. (the classic consumer/producer scenario) If you need to speed up things you might think to have another thread doing some pre-fetching (if that make sense in your sw design/architecture)

CiaoCiao
Sergio

OTHER TIPS

Sergio is right - if you can look at GCD and serialized queues, it shouldn't be too hard to migrate to it. Take a look at the videos from Apple for good how-to steps.

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