一个稍微不同的方法是只派遣几个图像开始,然后在任何先前的请求结束时再发送一个图像。代码如下所示
- (IBAction)startButtonPressed
{
self.nextImageNumber = 1;
for (int i = 0; i < 2; i++)
[self performSelectorOnMainThread:@selector(getImage) withObject:nil waitUntilDone:NO];
}
- (void)getImage
{
if (self.view.window && self.nextImageNumber <= 6)
{
int n = self.nextImageNumber++;
NSLog(@"Requesting image %d", n);
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://images.apple.com/v/iphone-5s/gallery/a/images/download/photo_%d.jpg", n]];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:url]];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Received image %d", n);
[self updateImage:image forView:n];
[self performSelectorOnMainThread:@selector(getImage) withObject:nil waitUntilDone:NO];
});
});
}
}
正在下载的图像通过“photo_6.jpg”命名为“photo_1.jpg”。该过程通过请求前两张照片开始。当其中一个完成时,发送下一个请求,依此类推,直到检索到所有6张照片。的代码的关键行是
if (self.view.window && self.nextImageNumber <= 6)
的if
检查视图控制器是否仍然在屏幕上的第一部分。当用户离开视图控制器时,self.view.window
将被设置为nil
。因此,从视图控制器导航将打破下载链。
if
的第二部分检查是否所有下载都已完成。这很容易做,因为文件名包含一个数字。对于随机文件名,您可以使用URL填充NSArray,然后通过数组索引,直到达到最终。
我开始链接下载2次,因为只有6个图像下载在该URL。根据图像大小和图像数量的不同,您可能希望先调度更多。权衡是为了最大化带宽使用(从更多开始)与最小化取消时间(通过以较少开始)。
不幸的是我没有使用NSURConnection。 – CMOS
也许是它交换时间..:P你在用什么?你应该更新你的问题 – Fonix
目前使用UIImage * img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:myImg]]; – CMOS