2014-02-09 4 views
0

У меня есть статическая ячейка с 2 секциями. Один раздел имеет 2 строки, а другой - одну строку. Одна из ячеек в первом разделе выполняет операцию, которая может занять до минуты (дешифрование большого количества данных из базы данных, а затем ее снова шифрование).tableview static cell динамический нижний колонтитул

Чтобы сообщить пользователю, что операция продолжается и не застревает, Я пытаюсь сделать следующее: (внизу псевдо моего фактического кода)

Выпуск.

footerString в doStuff не показан Однако один в callDoStuff показан очень хорошо .. Любые идеи, что я делаю неправильно?

- (void) doStuff 
{ 
    for (int i=0; i<[resultsArray count]; i++) 
    { 
     rec1 = [decrypt record1]; 
     footerString = [@"Preparing item : " stringByAppendingString:rec1]; 
     [self.tableView reload]; 
     rec2 = [decrypt record2]; 
     ... 
     ... 
     ... 
     rec10 = [decrypt record10]; 
    } 
} 

doStuff вызывается из другой функции

- (void) callDoStuff 
{ 
    [self doStuff]; 
    footerString = @"Done preparing items"; 
    [self.tableView reload]; 
} 

У меня есть следующий в моем tableviewcontroller

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section 
{ 
    if (section == 0) 
     return footerString; 
    else 
     return @""; 
} 

ответ

1

Вы должны сделать ваш расчет в фоновом потоке. Здесь вы назначаете новое значение своей UILabel, но основной поток не имеет времени для обновления представления.

- (void) callDoStuff 
{ 
    [self doStuff]; 
} 

- (void)doStuff { 
    dispatch_async(dispatch_queue_create("myqueue", NULL) , ^(void) { 
     // Here you enter in another thread 
     for (int i=0; i<[resultsArray count]; i++) 
     { 
      rec1 = [decrypt record1]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       // Here you send message to your UILabel in your main thread 
       footerString = [@"Preparing item : " stringByAppendingString:rec1]; 
      }); 
      [self.tableView reload]; 
      rec2 = [decrypt record2]; 
      ... 
      rec10 = [decrypt record10]; 
     } 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Here you send a callback 
      [self doOtherStuffAfterDoStuff]; 
     }); 
    });  
} 

- (void)doOtherStuffAfterDoStuff { 
    footerString = @"Done preparing items"; 
    [self.tableView reload]; 
} 

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

+0

Спасибо. Попробуем сегодня вечером и отметьте ответ, если он сработает! – rkh

+0

Просто обратите внимание, что вам нужно будет добавить еще один обратный вызов в конце вашей большой операции, а затем перезагрузить таблицу. – AncAinu

+0

Ну, это работает, но проблема в том, что выполнение в 'callDoStuff' продолжается, не дожидаясь завершения' doStuff' ... Это проблематично для моей цели ... В любом случае ждать завершения выполнения 'doStuff'? – rkh

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