2015-09-01 2 views
0

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

Некоторые примечания:

  • Делегирование и DataSource подключены правильно, так как метод работает, просто не каждый раз, когда я хочу
  • Я также попытался диспетчерская весь цикл в асинхронном блок
  • Я пытался дозвониться только reloadData() в асинхронном блоке (источники лота рекомендовали попробовать)
  • Я пробовал множество комбинаций, включая функции beginUpdates, endUpdates, reload/insert sections/rows. Вы получаете дрейф.
  • При вызове reloadData(), метод NumberOfSections всегда вызывается, но cellForRow только после того, как вся работа сделана
  • Для клеток, которые я использую собственные клетки UITableViewAutomaticDimension собственности на Tableview. Это гарантирует правильность отображения многострочного текста. Я действительно хочу верить, что мои ограничения на ячейки прекрасны.

Исчисление Обзор Код:

override func viewDidAppear(animated: Bool) { 

    for i in 0..<data.count { 

     // Do computationally intensive work 

     results[i].append(result) // multidimensional array 
     Util.safeInc(&doneCounter) // made thread-safe just in case with objc_sync_enter 
     resultTableView.reloadData() 
    } 
} 

Ниже приведены функции Tableview. Я создал расширяемый tableview. Также есть некоторые функции заголовка, чтобы создать отступы между разделами и функцию выбора. Они, похоже, не важны здесь.

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if expandedCells.contains(section) { 
     return results[section].count + 1 
    } else { 
     return 1 
    } 

} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return doneCounter 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    if indexPath.row == 0 { 
     let cell = tableView.dequeueReusableCellWithIdentifier("titleCell") as! electionNameTableViewCell 
     cell.label.text = ... 
     return cell 
    } else { 
     let cell = tableView.dequeueReusableCellWithIdentifier("resultCell") as! resultTableViewCell 
     // set texts for cell labels 

     return cell 
    } 
} 

Любые идеи?

ответ

0

Я закончил с использованием моей собственной очереди + диспетчерская reloadData() в основную очередь от него.

override func viewDidAppear(animated: Bool) { 
    let backgroundQueue = dispatch_queue_create("com.example.workQueue", DISPATCH_QUEUE_SERIAL); 
    for i in 0..<data.count { 
     dispatch_async(backgroundQueue) { 
      // Do computationally intensive work 
      dispatch_async(dispatch_get_main_queue()) { 
       resultTableView.reloadData() 
      } 
     } 
    } 
} 
0

Вы должны вызвать resultTableView.reloadData() в главном потоке, как так:

dispatch_async(dispatch_get_main_queue) { 
    resultTableView.reloadData() 
} 
+0

Как я уже говорил (пятая нота), это рекомендуется в большинстве мест, но по какой-то причине это работает даже меньше, так как даже не 'numberOfSectionsInTableView' вызывается, когда я делаю это. – Kelo

+0

Я читал это, но было непонятно, что вы назвали его в основном потоке. Для вычислительной части вы пытались изменить логику, как вызвать блок завершения после каждого «цикла», который вызывает перезагрузку данных + до тех пор, пока все вычисления не будут выполнены? – Loegic

+0

Я попробую – Kelo

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