У меня есть 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()
}
Привет, спасибо, что сообщили мне о runloop. Я исправлю это соответственно. Что касается повторяющегося таймера, я хочу, чтобы он повторялся, потому что я хочу, чтобы он обновлял таймер в реальном времени. Если я установил параметр 'repeat:' в 'scheduleTimerWithTimeInterval' как' false', таймер не будет обновляться в реальном времени. Я прошу прощения за последнюю часть вопроса, я был крайне неряшлив, потому что я не хотел размещать слишком много кода. Я отредактирую его соответствующим образом и постараюсь сделать вещи более ясными. – user1871869
Я разместил свои правки выше. Я вынул какой-то вводящий в заблуждение код и показал, как работают мои 'UITableViewCells'. Я извиняюсь раньше. Поэтому в основном то, что я хочу сделать, это когда 'timeLeft()' изменился на 0, я хочу удалить эту ячейку из 'UITableView' в реальном времени. Тем не менее, я понимаю, что выполнение этого в 'SetCellContents' не лучший метод для этого, потому что я также вызываю этот метод при вставке в мой« tableView », поэтому я получаю конфликты. Мне было интересно, существует ли метод, когда я могу найти, когда таймер каждой ячейки достигает 0, а затем полностью удаляет эту ячейку. – user1871869
Ничего, я все это исправил. Выполняется код выше. Спасибо за вашу помощь! – user1871869