2015-06-26 5 views
3

Итак, я прочитал несколько сообщений о системе очередей, но я не могу понять, как делать то, что я ищу. В настоящее время я перехожу на страницу и загружаю изображения с использованием цикла, и каждое изображение использует асинхронную отправку, видимую здесь.Остановить или полностью стереть iOS Global Dispatch Queue

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, что вы используете? вы должны обновить свой quesiton – 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_1.jpg» через «photo_6.jpg». Процесс начинается с запроса первых двух фотографий. Когда одна из этих концов заканчивается, отправляется следующий запрос и так далее, пока все 6 фотографий не будут восстановлены. Ключевая строка кода

if (self.view.window && self.nextImageNumber <= 6) 

первая часть if проверяет, находится ли контроллер зрения все еще находится на экране. Когда пользователь переходит от контроллера вида, self.view.window будет установлен в nil. Таким образом, переход от контроллера просмотра нарушает цепочку загрузок.

Вторая часть if проверяет, завершены ли все загрузки. Это легко сделать, поскольку имена файлов содержат число. Для случайных имен файлов вы можете заполнить NSArray URL-адресами, а затем проиндексировать массив, пока не достигнете конца.

Я начал цепочку с 2 загрузок, потому что есть только 6 изображений для загрузки по этому URL-адресу. В зависимости от размера изображения и количества изображений, вы можете начать с отправки большего количества. Компромисс заключается в максимизации использования полосы пропускания (начиная с большего количества) по сравнению с минимальным временем отмены (начиная с меньшего).