Остановить или полностью удалить глобальную очередь отправки 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 изображения), и это занимает почти минуту, потому что это все еще ждет загрузки других изображений. Есть ли способ уничтожить мою старую очередь или приостановить ее? Я видел, как люди говорили: «Вы можете, но это испортит входящие данные», и это нормально, потому что изображение просто загружалось повторно при загрузке новой страницы. Любые идеи?


person CMOS    schedule 26.06.2015    source источник


Ответы (2)


Немного другой подход заключается в отправке только нескольких изображений для начала, а затем отправке еще одного, когда любой из предыдущих запросов завершится. Вот как выглядит код

- (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 загрузок, потому что по этому URL-адресу можно загрузить только 6 изображений. В зависимости от размеров и количества изображений вы можете начать с отправки большего количества изображений. Компромисс заключается в том, чтобы максимизировать использование полосы пропускания (начав с большего) и свести к минимуму время отмены (начав с меньшего).

person user3386109    schedule 26.06.2015

если вы используете NSURLConnection, вам, возможно, следует хранить ссылки на них за пределами блоков, а затем, если вы отойдете от экрана, вызовите [downloadConnection cancel] для каждого из них

person Fonix    schedule 26.06.2015
comment
К сожалению, я не использую NSURConnection. - person CMOS; 26.06.2015
comment
может быть, пришло время поменяться местами .. :P что ты используешь? вы должны обновить свой вопрос - person Fonix; 26.06.2015
comment
В настоящее время используется UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:myImg]]; - person CMOS; 26.06.2015