2015-05-05 2 views
-2

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

//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() 
} 

ответ

0

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

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

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

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

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

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

+0

Привет, спасибо, что сообщили мне о runloop. Я исправлю это соответственно. Что касается повторяющегося таймера, я хочу, чтобы он повторялся, потому что я хочу, чтобы он обновлял таймер в реальном времени. Если я установил параметр 'repeat:' в 'scheduleTimerWithTimeInterval' как' false', таймер не будет обновляться в реальном времени. Я прошу прощения за последнюю часть вопроса, я был крайне неряшлив, потому что я не хотел размещать слишком много кода. Я отредактирую его соответствующим образом и постараюсь сделать вещи более ясными. – user1871869

+0

Я разместил свои правки выше. Я вынул какой-то вводящий в заблуждение код и показал, как работают мои 'UITableViewCells'. Я извиняюсь раньше. Поэтому в основном то, что я хочу сделать, это когда 'timeLeft()' изменился на 0, я хочу удалить эту ячейку из 'UITableView' в реальном времени. Тем не менее, я понимаю, что выполнение этого в 'SetCellContents' не лучший метод для этого, потому что я также вызываю этот метод при вставке в мой« tableView », поэтому я получаю конфликты. Мне было интересно, существует ли метод, когда я могу найти, когда таймер каждой ячейки достигает 0, а затем полностью удаляет эту ячейку. – user1871869

+0

Ничего, я все это исправил. Выполняется код выше. Спасибо за вашу помощь! – user1871869

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