在iOS中下载图像时更新UI(标签)

时间:2014-06-05 14:31:26

标签: ios objective-c nsthread

这是下载图像的功能,在此功能中我必须更新UI,UILabels显示总图像和计数器值(下载的图像)。

这就是我调用线程的原因。

-(void) DownloadImages
{
 NSLog(@"Images count to download %lu",(unsigned long)[productID count]);
if ([productID count] > 0)
{
     // Document Directory
     NSString *myDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
     for (i = 0; i < [productID count]; i++)
     {
     [NSThread detachNewThreadSelector: @selector(UpdateLabels) toTarget:self withObject:nil];
     // [self UpdateLabels]; this does not work….
         NSLog(@"image no %d", i);
       //[self Status];
     NSString *imageURL = [NSString stringWithFormat:@"http://serverPath/%@/OnlineSale/images/products/%@img.jpg",clientSite,[productID objectAtIndex:i]];
     UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]]];
     // Reference path
     NSString *imagePath = [NSString stringWithFormat:@"%@/%@-1-lrg.jpg",myDirectory,[productID objectAtIndex:i]];
     NSData *imageData = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0f)];
     [imageData writeToFile:imagePath atomically:YES];   
     }
 NSLog(@"Downloading images completed...");
 }
 }

问题: - 对于我必须在每次新的NSThread 时调用的每个新图像,可能会有数千张图像,并且看起来很糟糕,会有数千个线程。

  • 在模拟器中我已经测试了 3000 图像,但在测试它时我的iPad出现了错误,,, 应用程序因内存压力退出并终止

我猜错误是由于每次调用新线程的方法。

我在这里做错了什么。????????????????

我搜索过两种不同的选择,但我不知道哪一种是正确的选择,

选项包括:

- [self performSelectorInBackground:@selector(UpdateLabels) withObject:nil];

- [NSThread detachNewThreadSelector: @selector(UpdateLabels) toTarget:self withObject:nil];

我也想知道如果我使用

  [NSThread cancelPreviousPerformRequestsWithTarget:self];

在选择器调用之后,是否正确接近.. ???

1 个答案:

答案 0 :(得分:1)

我的建议是使用NSOperationQueue。然后,您可以将maxConcurrentOperationCount属性设置为您喜欢的任何内容。 另外在你的情况下是最好的方法。 研究一下你的maxConcurrentOperationCount是什么,你的iphone可以运行多少并发线程而没有任何问题。 NSOperationQueue将管理此操作,为您运行具有此限制的新线程。

看起来应该是这样的:

NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
[myQueue setMaxConcurrentOperationCount:500];
for (i = 0; i < [productID count]; i++) {
    [myQueue addOperationWithBlock:^{

    // you image download here
    }];
}

但请先检查Apple参考。