此代码生成低内存警告,因为后台5线程几乎同时加载图像。
我想给每个线程优先考虑并锁定&开锁。 我会一步步做线程。图片1加载 - > image2 loading - > image3 loading - > image4 loading。
我该怎么做?
-(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];
}
来自网址的+(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;
}
答案 0 :(得分:0)
也许我误解了你的问题,但从你所说的,你真正想要的是“序列化”线程,即确保它们一个接一个地执行。如果是这种情况,如果他们花费大部分时间在一个“线程队列”中等待,我看不到有五个(或更多)线程的巨大优势:) 我的2美分:可能你应该考虑重新设计代码以便加载文件/图像的队列以及将图像出列并加载的线程,而不是使用线程的优先级在另一个之后。 (经典的消费者/生产者场景) 如果你需要加快速度,你可能会考虑让另一个线程做一些预取(如果你的sw设计/架构中有意义的话)
CiaoCiao
塞尔吉奥
答案 1 :(得分:0)
塞尔吉奥是对的 - 如果你能看一下GCD和序列化的队列,那么迁移它不应该太难。请查看videos from Apple以获取良好的操作步骤。