MBProgressHUD Сокрытие индикатора после GCD

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

 - (IBAction)SavePhotoOnClick:(id)sender{


    HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
    [self.navigationController.view addSubview:HUD];
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        NSURL *url = [NSURL URLWithString:urlstr1];
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);        dispatch_async(dispatch_get_main_queue(), ^{
            [MBProgressHUD hideHUDForView:self.view animated:YES];
        });
    });



        // Set determinate mode
    HUD.mode = MBProgressHUDModeDeterminate;
    HUD.dimBackground = YES;
    HUD.color = [UIColor colorWithRed:0.23 green:0.50 blue:0.82 alpha:0.90];
    HUD.delegate = self;
    HUD.labelText = @"Downloading Maps";

    // myProgressTask uses the HUD instance to update progress
    [HUD showWhileExecuting:@selector(myProgressTask) onTarget:self withObject:nil animated:YES];
    }


- (void)myProgressTask {
    // This just increases the progress indicator in a loop
    float progress = 0.0f;
    while (progress < 1.0f) {
        progress += 0.01f;
        HUD.progress = progress;
        usleep(40000);
    }
}

При удалении метода progresstask и кода showWhileExecuting индикатор прогресса удаляется. Кажется, что usleep переопределяет все и не позволяет скрыть индикатор прогресса после завершения загрузки, а вместо этого удаляет его через 4 секунды.

1 ответ

Решение

Ваша проблема в том, что myProgressTask не выполняет никакой реальной работы: ваша загрузка фактически происходит в вашем вызове dispatch_async. Используйте звонок как [hud showHUDAddedTo: self.navigationController.view animated:YES]; перед началом сетевого запроса, поэтому он будет скрыт после завершения загрузки. Это покажет только вращающийся индикатор, а не круг прогресса.

Если вам нужен круг выполнения, вам нужно будет использовать NSURLConnection и связанные с ним методы делегата, чтобы отслеживать ход загрузки. В частности, посмотрите на connection:didReceiveResponse: метод - с использованием expectedContentLength рассчитать процент, используя значения, полученные из connection:didReceiveData: метод постепенного обновления этого прогресса.

Проверьте этот вопрос для примера того, как это сделать.

Другие вопросы по тегам