0

此代码生成内存不足警告,因为后台 5 线程几乎同时加载图像。

我想优先考虑每个线程并进行锁定和解锁。我会一步一步地制作线程。图片 1 加载 -> image2 加载 -> image3 加载 -> image4 加载。

我怎样才能做到这一点?

视图控制器

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

2 回答 2

0

也许我误解了你的问题,但从你所说的来看,你真正想要的是“序列化”线程,即确保它们一个接一个地执行。如果是这种情况,我认为拥有五个(或更多)线程没有很大优势,如果它们大部分时间都在等待一种“线程队列”:)
我的 2 美分:而不是使用线程的优先级,也许您应该考虑重新设计代码以具有要加载的文件/图像队列以及一个接一个出列并加载图像的线程。(经典的消费者/生产者场景)如果您需要加快速度,您可能会认为让另一个线程进行一些预取(如果这在您的软件设计/架构中有意义)

快快
塞尔吉奥

于 2012-03-25T10:26:06.957 回答
0

Sergio 是对的 - 如果您可以查看 GCD 和序列化队列,迁移到它应该不会太难。观看来自 Apple的视频,了解良好的操作步骤。

于 2012-03-25T10:46:20.773 回答