Форматирование даты и времени в ячейках UITableView

Мне нужно отформатировать дату и время в tableView:cellForRowAtIndexPath: Поскольку создание NSDateFormatter – довольно тяжелая операция, я сделал их статическими. Это лучший подход к форматированию даты и времени для каждой строки?

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; MyCell*cell = (MyCell*)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; static NSDateFormatter *dateFormatter = nil; if (!dateFormatter) { dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setLocale:[NSLocale currentLocale]]; [dateFormatter setDateStyle:NSDateFormatterLongStyle]; } cell.dateLabel = [dateFormatter stringFromDate:note.timestamp]; static NSDateFormatter *timeFormatter = nil; if (!timeFormatter) { timeFormatter = [[NSDateFormatter alloc] init]; [timeFormatter setTimeStyle:NSDateFormatterShortStyle]; } cell.timeLabel = [timeFormatter stringFromDate:note.timestamp]; return cell; } 

3 Solutions collect form web for “Форматирование даты и времени в ячейках UITableView”

Я бы не использовал статическую переменную, потому что тогда вы почти наверняка закончите утечку памяти. Вместо этого я бы использовал два экземпляра или свойства экземпляра NSDateFormatter * для этого объекта контроллера, которые создаются только по требованию. Когда выгружается представление или контроллер освобождается, вы можете их освободить.

Например:

 @interface MyViewController : UITableViewController { NSDateFormatter *dateFormatter; NSDateFormatter *timeFormatter; } @end @implementation MyViewController - (void)viewDidUnload { // release date and time formatters, since the view is no longer in memory [dateFormatter release]; dateFormatter = nil; [timeFormatter release]; timeFormatter = nil; [super viewDidUnload]; } - (void)dealloc { // release date and time formatters, since this view controller is being // destroyed [dateFormatter release]; dateFormatter = nil; [timeFormatter release]; timeFormatter = nil; [super dealloc]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // ... // if a date formatter doesn't exist yet, create it if (!dateFormatter) { dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setLocale:[NSLocale currentLocale]]; [dateFormatter setDateStyle:NSDateFormatterLongStyle]; } cell.dateLabel = [dateFormatter stringFromDate:note.timestamp]; // if a time formatter doesn't exist yet, create it if (!timeFormatter) { timeFormatter = [[NSDateFormatter alloc] init]; [timeFormatter setTimeStyle:NSDateFormatterShortStyle]; } cell.timeLabel = [timeFormatter stringFromDate:note.timestamp]; return cell; } @end 

Я читал в разных местах, что если вы используете NSDateFormatter много, вы должны настроить статическую переменную, но при тестировании этого метода я обнаружил, что он использовал намного больше памяти.

Но в вашем коде вы не используете статические переменные для своих форматировщиков. Попробуйте следующую модификацию:

 static NSDateFormatter *dateFormatter = nil; if (!dateFormatter){ dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setLocale:[NSLocale currentLocale]]; [dateFormatter setDateStyle:NSDateFormatterLongStyle]; } cell.dateLabel = [dateFormatter stringFromDate:note.timestamp]; // And same approach for timeFormatter 

Это может не спасти память (так как ваши 2 экземпляра форматирования будут работать в течение всего периода выполнения), но создание форматирования – это тяжелая операция, поэтому этот подход значительно улучшает производительность вашего метода

Вы можете использовать это для повторного использования NSDateFormatter: https://github.com/DougFischer/DFDateFormatterFactory#readme

PS: Поскольку вы устанавливаете только формат и локаль для своих форматировщиков данных.

  • Внедрить делегата во время выполнения?
  • Как программно отклонить UIAlertController без каких-либо кнопок?
  • viewDidLoad, awakeFromNib, initWithCoder: ... Где инициализировать участников?
  • Нынешний MFMailComposeViewController от модального FormSheet на iPad?
  • iOS - In-App Purchase & applicationDidBecomeActive
  • Какова роль UINavigationTransitionView, UILayoutContainerView и UIViewControllerWrapperView
  • Каковы недостатки, связанные с тем, чтобы каждое свойство было сильным?
  • Как изменить размер изображения в соответствии с ячейкой UITableView?
  • Может ли UIWebView взаимодействовать (общаться) с приложением?
  • Имеет ли IBOutlet __weak?
  • Как изменить выбранное изображение на вкладке с помощью раскадровки
  • Interesting Posts

    UIKeyCommand с модификатором не будет распознаваться при первом вызове

    Захват экрана

    DSYM и двоичные файлы, необходимые для обозначения? Или просто DSYM?

    Запуск инструментов Apple для автоматизации с терминала

    iOS: возврат к основному XIB из вторичного XIB

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

    Пользовательская ячейка iOS 7 не отображается в виде таблицы

    Альтернатива AVAudioSession на OSX для получения частоты дискретизации аудио драйвера

    Как удалить уже установленные профили подготовки из iphone на IOS7

    Xcode 7.2 Синтаксис Подсветка мерцания в файлах Swift

    IOS UITabBar selectionIndicatorImage Y позиция

    Временная метка кадра AVCaptureSession и AVCaptureMovieFileOutput

    Удалите сигнал ReactiveCocoa из элемента управления

    Как вы переводите и масштабируете представление, не превращаясь в конфликты друг с другом?

    ios: доступ к контроллеру навигации из делегата приложения

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.