Таймеры в каждой ячейки UITableView


#1

Здравствуйте. Не подскажите, как можно запускать одновременно несколько таймеров для каждой ячейки таблицы в UITableView и чтобы они не смешивались между собой?

Я запускаю и останавливаю таймеры в didSelectRowAt:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    let cell = tableView.cellForRow(at: indexPath) as! TimerTableViewCell
    let item = timers.items[indexPath.row]
    item.toggle()
    print(item)
    startPauseTimer(for: cell, with: item)
}
```

Это код для старта и остановки таймеров:
```
var timer = Timer()

    func startPauseTimer(for cell: TimerTableViewCell, with item: Timers) {
       if !item.isStarted {
           timer.invalidate()
           } else {    
           timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {timer in
                item.seconds -= 1
                cell.timerTime.text = self.formattedTime(time: TimeInterval(item.seconds))

               if item.seconds < 1 {
                   self.timer.invalidate()
                   cell.timerTime.text = self.formattedTime(time: TimeInterval(item.seconds))
                   item.isStarted = false
               }
        }
       }
    }
```

И дата модель:

class Timers: NSObject, Codable {
  var name = ""
  var id = ""
  var seconds = 0
  var editSeconds = 0
  var isStarted = false

  func toggle() {
        isStarted = !isStarted
    }
```

#2

Заучим вам столько таймеров, сохраняйте даты старта по индексу, и тогда вам нужен будет только один таймер на всю таблицу


#3

Мне нужно, чтобы в каждой ячейки был отдельный таймер. Такая задача. Я делаю такое приложение.


#4

@Jack от части прав, вам нужно хранить для каждой ячейки время старта.
Во время инициализации ячейки вытаскиваете дату старта, если она есть и внутри самой ячейки запускаете таймер исходя от полученной даты.
Когда ячейка уничтожается, обнуляйте таймер в ней, что бы освободить память.

Хотя может быть @Jack и прав по поводу одного таймера, если конечно не возникнет гемороя с обновлением видимых ячеек.


#5

Это все понятно. Как можно запускать одновременно несколько таймеров в разных ячейках и останавливать их?


#6

Я же вам сказал, делайте в классе ячейки таймер и работайте с ним.


#7

У вас этот таймер находится в контроллере? по крайней мере похоже на это
Если вы хотите для каждой ячейки свой таймер, вам проще всего определить его внутри самой ячейки и стартовать его при нажатии и/или func tableView( _ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell


#8

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


#9

Пересмотрите вашу Дату, вам важно сохранить Date старта и тоне вы уже сможете выставлять правильное значение сравнивая с настоящим временем

В чем прикол наследования от NSObject если не секрет?


#10

А какой тогда метод можно использовать, чтобы обновлять значения ячеек, если они снова показываются в области видимости?