2013-07-07 2 views
0

У меня очень длинный цикл расчета. Чтобы дать пользователю представление о прогрессе, я бы предпочел обновить некоторые выходные данные, отображаемые в UILabels, чтобы пользователь мог просмотреть промежуточный вывод.UILabel отображает регулярные обновления, пока цикл выполняется

// Run Activity for Year 
    for (int day = 1; day < 366; day++) { 
     for (int hour = 1; hour < 25; hour++) { 
      for (int minute = 1; minute < 61; minute++) { 
       display = (day*10000)+(hour*100)+minute; 
       self.displayTest.text = [[NSString alloc] initWithFormat: @"%d", display]; 
      } 
     } 
    } 

Очевидно, что self.display.text не будет обновляться, пока -(void) viewDidAppear:(BOOL)animated не завершена.

Как его получить, чтобы обновить данные, скажем, всякий раз, когда цикл часов завершен? Вы вводите фантомную кнопку и обновляете ее. Это кажется мне немного грубым. Я не хочу прибегать к использованию индикатора активности или представления прогресса. Благодарю.

ответ

1

Почему бы не выполнить логику на отдельном NSThread и периодически запускать обновления пользовательского интерфейса в основной теме? например, каждый раз, когда завершаются все итерации «часа» (до 24, после каждого «дня»), выполняйте логику пользовательского интерфейса в основном потоке.


Пример:

- (void)updateUI:(NSNumber*)display { 
    self.displayTest.text = [[NSString alloc] initWithFormat: @"%@", display]; 
} 

- (void)yearStuff { 
    for (int day = 1; day < 366; day++) { 
     int display; 
     for (int hour = 1; hour < 25; hour++) { 
      for (int minute = 1; minute < 61; minute++) { 
       display = (day*10000)+(hour*100)+minute; 
      } 
     } 
     [self performSelectorOnMainThread:@selector(updateUI:) withObject:[NSNumber numberWithInteger:display] waitUntilDone:YES]; 
    } 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [self performSelectorInBackground:@selector(yearStuff) withObject:nil]; 
} 
+0

Я ценю логику, и я уверен, что это правильно. Я подозреваю, что что-то отсутствует, поскольку он только обновляет литерал, когда цикл завершен. Есть что-то, что мне нужно добавить или инициализировать? –

+1

Это на самом деле [self performSelectorOnMainThread: @selector (updateUI :) withObject: [Номер NSNumberWithInteger: display] waitUntilDone: YES]; –

+0

@EdwardHasted обновленный ответ. –

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