一個稍微不同的方法是隻派遣幾個圖像開始,然後在任何先前的請求結束時再發送一個圖像。代碼如下所示
- (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