2015-06-26 164 views
3

因此,我在这里阅读了关于排队系统的几篇文章,但似乎无法弄清楚如何去做我正在寻找的东西。目前我正在使用一个循环进入一个页面并加载图像,并且每个图像都使用这里看到的异步调度。停止或完全清除iOS全球调度队列

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    //Load Image Code Goes Here 
    dispatch_async(dispatch_get_main_queue(), ^{ 
      //Display Image Code Goes Here After Loading. 
    }); 
}); 

而且这个工作很完美,但是我需要能够销毁这个队列,或者等到它完成之后再做其他事情。基本上某些页面有几十个和几十个图像,所以他们都开始加载,然后我去应用程序中一个完全独立的区域,并做一个完全不同的图像加载(1-2图像),这将需要近一分钟,因为它是仍在等待其他图像加载。有没有办法摧毁我的旧队列或暂停?我看到一个人说“你可以,但它会破坏传入的数据”这很好,因为图像只是在新的页面加载时重新下载。有任何想法吗?

回答

0

,如果您使用的是NSURLConnection的,你也许应该保持对它们的引用块外面,然后如果你从屏幕调用[downloadConnection cancel]他们每个人搬走

+0

不幸的是我没有使用NSURConnection。 – CMOS

+0

也许是它交换时间..:P你在用什么?你应该更新你的问题 – Fonix

+0

目前使用UIImage * img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:myImg]]; – CMOS

1

一个稍微不同的方法是只派遣几个图像开始,然后在任何先前的请求结束时再发送一个图像。代码如下所示

- (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。根据图像大小和图像数量的不同,您可能希望先调度更多。权衡是为了最大化带宽使用(从更多开始)与最小化取消时间(通过以较少开始)。