2015-06-26 162 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。根據圖像大小和圖像數量的不同,您可能希望先調度更多。權衡是爲了最大化帶寬使用(從更多開始)與最小化取消時間(通過以較少開始)。