Как изменить время задержки для объекта в DispatchQueue - PullRequest
1 голос
/ 30 сентября 2019

У меня есть tableView, где ячейки появляются с определенной задержкой. Задержка зависит от того, сколько букв в тексте каждой ячейки. Поэтому мой вопрос заключается в том, есть ли способ изменить время задержки, если пользователь что-то делает (например, прокручивает tableView).

В идеале я хочу, чтобы следующая ячейка появлялась без задержки вообще, если tableView прокручивается вниз.

Я предполагаю, что ответ лежит где-то в DispatchQueue.main.async(execute: task). Хотя я не уверен, выполняет ли он только следующую задачу в очереди или все задачи в очереди. (Видимо, мне нужно только следующее задание). Во всяком случае с кодом ниже мое приложение вылетает.

var task: DispatchWorkItem?
var lastContentOffset: CGFloat = 0

//Checking if tableView was scrolled.

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
   if lastContentOffset < scrollView.contentOffset.y {
        print("Table view scrolled-down!")
        DispatchQueue.main.async(execute: task!)
   }
   else{
        print("Scrolled up")
   }
}

//Updating my tableView with delay

func updateTableView(nextPassageID: Int) {

    task = DispatchWorkItem {
         self.numberOfCells += 1
         let indexPath = IndexPath(row: nextPassageID, section: 0)
         self.tableView.insertRows(at: [indexPath], with: .fade)
    }

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delay, execute: task!)
}

Любая помощь будет принята с благодарностью. Ура!

1 Ответ

1 голос
/ 30 сентября 2019

Как изменить время задержки для объекта в DispatchQueue

Итог, вы не делаете. Если вы хотите, чтобы он запускался раньше, чем планировалось ранее, просто cancel и отправьте создание нового без каких-либо задержек, связанных с ним.

В качестве альтернативы, вы можете использовать Timer, который вы можете запланировать, но также fire до наступления запланированной даты пожара, он запустит ее и затем invalidate it.

Только будьте осторожны с сильными ссылочными циклами. Например, в ваших замыканиях (будь то DispatchWorkItem или в таймере на основе замыканий рассмотрите возможность использования списка захвата [weak self], чтобы замыкание не поддерживало строгую ссылку на self. Аналогично, если у вас есть ивар для вашегоDispatchWorkItem или Timer, рассмотрите (a) использование локальной переменной для элемента / таймера, (b) добавьте это в свою очередь / цикл выполнения, а затем (c) сделайте ваш ivar ссылкой weak, чтобы приэлемент запускается и / или срабатывает таймер, и ваш ивар будет автоматически выпущен, избегая зависания от ссылок по истечении срока их полезного использования.

...