2013-03-29 3 views
0

У меня есть математическая функция (около O^(10^7)), и во время ее поиска мне нужно показать прогресс. Поэтому у меня есть индикатор прогресса. Вопрос в том, как обновить индикатор выполнения? Я пытался сделать это так:Как обновить индикатор выполнения при выполнении большой математической функции (цель-c)?

self.progressBar.progress = 0.0; 
self->progress = 0.0; 
for (1..10^7) { 
    ... 
    if (self.progressBar.progress < self.progress + 0.01) { 
     [self updateProgress]; 
    } 
} 
[self updateProgress]; 
+0

выглядит это нереально писать код на StackOverflow через Iphone :( –

+0

- (Недействительными) UpdateProgress {[self.progressBar setProgress: self-> прогресс анимации: YES];} –

+0

я пытался использовать performSelectorOnMainStream тоже .. и dispatch_async –

ответ

2

Выполнить операцию в отдельном потоке. Это обязательно.

Можете ли вы разделить операцию на шаги? Знаете ли вы количество шагов? Затем обновите индикатор выполнения после каждого шага до stepIndex/numSteps процентов.

Если вы не можете разделить операцию на шаги, но вы знаете, как долго будет выполняться операция, вы можете обновить планку до timeSinceStart/expectedTime процентов. Для периодических обновлений используйте NSTimer.

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

+0

Я сделал это с помощью performSelectorOnBackground (для calc.), А в фоновом режиме выполнитеSelectorInMainThread (для UI)! –

1

Иногда вы должны сделать:

CFRunLoopRunInMode (CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent()), 0, FALSE); 

Чтобы получить пользовательский интерфейс для обновления индикатор выполнения.

Также .. у вас есть анимированные: ДА, и это не доступно во всех версиях iOS.

Вы могли бы хотеть рассмотреть вместо этого в вашем методе UpdateProgress:

if ([activityProgressView respondsToSelector:@selector(setProgress:animated:)]) { 
    [activityProgressView setProgress:0.5 animated:YES]; 
} 
else { 
    [activityProgressView setProgress:0.5]; 
} 
CFRunLoopRunInMode (CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent()), 0, FALSE); 
+0

Выполнение операции в отдельной теме намного лучше. – Sulthan

+0

этот код мне не помог, он обновляет вид после вычислений –

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

  • Нет связанных вопросов^_^