Я хочу дать приоритет каждому фоновому потоку и постепенно извиняться - PullRequest
0 голосов
/ 25 марта 2012

Этот код генерирует предупреждение о нехватке памяти, поскольку фоновый поток 5 почти одновременно загружает изображения.

Я хочу дать приоритет каждому потоку и сделать блокировку и разблокировку. Я бы сделал пошаговую нить. загрузка изображения 1 -> загрузка изображения 2 -> загрузка изображения 3 -> загрузка изображения 4

Как я могу это сделать?

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

загрузка изображения

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

изображение добавить

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

изображение с 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;
}

Ответы [ 2 ]

0 голосов
/ 25 марта 2012

Серхио прав - если вы посмотрите на GCD и сериализованные очереди, вам не составит труда перейти на него.Посмотрите видео от Apple , чтобы узнать, как это сделать.

0 голосов
/ 25 марта 2012

возможно, я неправильно понял ваш вопрос, но из того, что вы сказали, вы действительно хотите "сериализовать" потоки, то есть убедиться, что они выполняются один за другим.Если это так, я не вижу большого преимущества в наличии пяти (или более) потоков, если они проводят большую часть времени в ожидании в виде «очереди потоков» :) Мои 2 цента: Вместо того, чтобы играть с приоритетом потоков, возможно, вам следует подумать о переделке кода, чтобы иметь очередь файлов / изображений для загрузки и поток, который удаляет и загружает изображения один за другимдругой.(классический сценарий потребитель / производитель ) Если вам нужно ускорить работу, вам может показаться, что другой поток выполняет предварительную выборку (если это имеет смысл в вашем дизайне / архитектуре sw)

Пока покаSergio

...