2013-05-06 2 views
0

Я хочу реализовать индикатор выполнения в своем приложении. Процесс происходит, когда приложение копирует каталог в каталог документов iOS. Обычно занимает от 7 до 10 секунд (iPhone 4 протестирован). Мое понимание баров прогресса - вы обновляете планку, когда все происходит. Но, основываясь на копировании кода каталога, я не уверен, как узнать, насколько далеко он находится.Панель UIProgressView во время процесса

Может ли кто-нибудь предложить какие-либо предложения или примеры того, как это можно сделать? Ниже показан код последовательности выполнения и копирование кода каталога.

Спасибо!

UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle: UIProgressViewStyleBar]; 
progressView.progress = 0.75f; 
[self.view addSubview: progressView]; 
[progressView release]; 


//Takes 7-10 Seconds. Show progress bar for this code 
if (![fileManager fileExistsAtPath:dataPath]) { 
    NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; 
    NSString *imageDataPath = [bundlePath stringByAppendingPathComponent:_dataPath]; 
    if (imageDataPath) { 
     [fileManager copyItemAtPath:imageDataPath toPath_:dataPath error:nil]; 
    } 
} 
+0

Смотрите эту тему: http://stackoverflow.com/questions/10414802/how- to-show-the-progress-of-copy-a-large-file-in-ios – Amit

+0

@ amit3117 Спасибо amit! Я новичок в объекте-с, как я могу начать отдельные потоки на основе предложения по ссылке? Спасибо – Teddy13

+1

Запустите таймер, вызвав: [NSTimer scheduleTimerWithTimeInterval: 0.5 target: self selector: @selector (targetMethod :) userInfo: nil repeat: YES]; это вызовет обратный вызов в targetMethod каждые 0,5 секунды. то вы можете обновить процент выполнения, скопированный в targetMethod, как показано ниже. – Amit

ответ

1

определяют NSTimer * таймер в вашем файле .h

if (![fileManager fileExistsAtPath:dataPath]) { 
    NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; 
    NSString *imageDataPath = [bundlePath stringByAppendingPathComponent:_dataPath]; 
    timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(updateProgressView) userInfo:nil repeats:YES]; 
    [timer fire]; 
    if (imageDataPath) { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      [fileManager copyItemAtPath:imageDataPath toPath_:dataPath error:nil]; 
     }; 
    } 
} 

и добавить этот метод

- (void) updateProgressView{ 
    NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; 
    NSString *imageDataPath = [bundlePath stringByAppendingPathComponent:_dataPath]; 
    NSData *allData = [NSData dataWithContentsOfFile:imageDataPath]; 
    NSData *writtenData = [NSData dataWithContentsOfFile:dataPath]; 
    float progress = [writtenData length]/(float)[allData length]; 
    [pro setProgress:progress]; 
    if (progress == 1.0){ 
     [timer invalidate]; 
    } 
} 
+0

Спасибо! Я получаю сообщение об ошибке «float *». Ошибка: «Инициализировать float с несовместимым типом float». Какие-либо предложения? – Teddy13

+1

обновил ответ. Проверь это сейчас :) – Ushan87

1

Если это займет много времени, потому что в этом каталоге много файлов, вы можете копировать файлы по одному в цикле. Чтобы определить прогресс, вы можете/должны просто предположить, что копирование каждого файла занимает одинаковое время.

Обратите внимание, что вы не хотите блокировать пользовательский интерфейс в течение 7-10 секунд, поэтому вам нужно скопировать отдельный не основной поток. Установка индикатора выполнения, как весь код пользовательского интерфейса, должно быть сделано на среднем потоке с помощью:

dispatch_async(dispatch_get_main_queue(),^
{ 
    progressBar.progress = numberCopied/(float)totalCount; 
}); 

Бросок к float дает вам немного (в зависимости от количества файлов) с большей точностью, так как чисто int деление обрезает остаток.

Смежные вопросы