这是下载图像的功能,在此功能中我必须更新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 时调用的每个新图像,可能会有数千张图像,并且看起来很糟糕,会有数千个线程。
我猜错误是由于每次调用新线程的方法。
我在这里做错了什么。????????????????
我搜索过两种不同的选择,但我不知道哪一种是正确的选择,
选项包括:
- [self performSelectorInBackground:@selector(UpdateLabels) withObject:nil];
- [NSThread detachNewThreadSelector: @selector(UpdateLabels) toTarget:self withObject:nil];
我也想知道如果我使用
[NSThread cancelPreviousPerformRequestsWithTarget:self];
在选择器调用之后,是否正确接近.. ???
答案 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参考。