Удалить NSTimer/UITableViewCell в реальном времени?

У меня есть UITableView в котором у меня есть множество таймеров, установленных на каждом UITableViewCell, Каждый таймер начинается с момента, когда пользователь создает "пост" в моем приложении, и срок его действия истекает в течение 24 часов. Тем не менее, я хочу, чтобы, когда все 24 часа закончились, UITableViewCell удаляет себя в режиме реального времени, но я не могу понять, где или когда мне следует удалить таймер. У меня есть метод, который будет постоянно обновлять таймер каждую секунду, используя NSTimer.scheduledTimerWithTimeInterval и он обновляет таймеры на каждом UITableViewCell каждую секунду. Тем не менее, я не могу найти метод или найти, как я могу найти, если каждый таймер внутри каждого UITableViewCell завершен. Очевидно, я могу узнать, закончился ли таймер в viewDidLoad но это называется только тогда, когда представление становится активным. Есть ли какой-то метод, который мне не хватает, или что-нибудь, что я могу использовать, чтобы найти таймер через scheduledTimerWithTimeInterval метод закончен, и если он есть, удалить его? Вот мой код ниже:

//I have a self.offers array declared in the beginning of my class whcih will act as the UITableView data source.
var offers = [Offer]()


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    //Dequeue a "reusable" cell
    let cell = tableView.dequeueReusableCellWithIdentifier(offerCellIdentifier) as! OfferCell
    setCellContents(cell, indexPath: indexPath)
    return cell
}

func setCellContents(cell:OfferCell, indexPath: NSIndexPath!){
    let item = self.offers[indexPath.row]
    cell.offerName.text = item.offerName()
    cell.offerPoster.text = item.offerPoster()

    var expirDate: NSTimeInterval = item.dateExpired()!.doubleValue

    //Get current time and subtract it by the predicted expiration date of the cell. Subtract them to get the countdown timer.
    var timeUntilEnd = expirDate - NSDate().timeIntervalSince1970

    if timeUntilEnd <= 0 {
        //Here is where I want to delete the countdown timer but it gets difficult to do so when you are also inserting UITableViewCells and deleting them at the same time.
        self.offers.removeAtIndex(indexPath!.row)

        self.offersReference = Firebase(url:"<Database Link>")
        self.offersReference.removeValue()
        self.tableView.reloadData()
        cell.timeLeft.text = "Finished."
    }
    else{
        //Display the time left
        var seconds = timeUntilEnd % 60
        var minutes = (timeUntilEnd / 60) % 60
        var hours = timeUntilEnd / 3600

        cell.timeLeft.text = NSString(format: "%dh %dm %ds", Int(hours), Int(minutes), Int(seconds)) as String
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    var timeExpired = false
    //I set up my offers array above with completion handler
    setupOffers { (result, offer) -> Void in
        if(result == true){
            //Insert each row one by one.
            var currentCount = self.offers.count
            var indexPaths: [NSIndexPath] = [NSIndexPath]()
            indexPaths.append(NSIndexPath(forRow:currentCount, inSection: 0))
            self.offers.append(offer)
            currentCount++
            self.tableView.reloadData()
        }
    }
    // Do any additional setup after loading the view, typically from a nib.
    self.tableView.delegate = self
    self.tableView.dataSource = self
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.rowHeight = 145.0
}

//Called when you click on the tab
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.refreshTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "refreshView:", userInfo: nil, repeats: true)
    //Should fire while scrolling, so we need to add the timer manually:
    //var currentRunLoop = NSRunLoop()
    //currentRunLoop.addTimer(refreshTimer, forMode: NSRunLoopCommonModes)
}

override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)
    refreshTimer.invalidate()
    refreshTimer = nil
}

//Constantly refreshes the data in the offers array so that the time will continuously be updating every second on the screen.
func refreshView(timer: NSTimer){
    self.tableView.reloadData()
}

1 ответ

У вас есть несколько неправильных представлений, несколько проблем с вашим кодом, и ваше описание не ясно.

Если вы создаете таймер с помощью scheduleTimerWithTimeInterval, вам не нужно и не нужно добавлять его в цикл запуска. scheduledTimerWithTimeInterval метод делает это для вас.

Если вы создаете повторяющийся таймер, он никогда не "заканчивается". Это повторяется вечно. Если вместо этого вы создаете неповторяющийся таймер, он срабатывает один раз, а затем уходит. Вам не нужно удалять его. Только не держите сильную ссылку на него, и он будет освобожден после того, как сработает.

Вы говорите, что создаете таймер для каждой ячейки табличного представления, но код, который вы опубликовали, создает только один таймер для контроллера представления. Вы говорите: "... он обновляет таймеры на каждом UITableViewCell каждую секунду. Однако я не могу найти метод или найти способ найти, завершен ли каждый таймер внутри каждого UITableViewCell". Это не соответствует коду, который вы разместили. Ваш код запускает таймер раз в секунду, который просто сообщает табличному представлению перезагрузить данные.

Я предполагаю, что вы имеете в виду, что вы повторно отображаете счетчик оставшегося времени в каждой ячейке, когда срабатывает таймер?

Итак, вы спрашиваете, как выяснить, осталось ли время для всех ваших клеток item.timeLeft() достиг нуля? Вы не разместили код или требования для вашего timeLeft() функция, так что ваши читатели не могут сказать, что должно происходить.

Другие вопросы по тегам