2011-12-31 4 views
1

В типичном приложении iOS, где нужно разместить объекты широкого применения? Я хотел бы централизовать код форматирования даты, и мне было бы интересно услышать предложения по лучшим практикам для этого.Где подходящее место для размещения широкоформатного формата приложения в iOS?

К примеру, у меня есть следующий код, чтобы сделать форматирование даты:

NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
NSString *usFormatString = [NSDateFormatter dateFormatFromTemplate:@"EEE, MMM d YYY" options:0 locale:usLocale]; 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
formatter.dateFormat = usFormatString; 

((UILabel *)[selectedCell.contentView viewWithTag:1]).text = [formatter stringFromDate:date]; 

Я хотел бы сохранить код форматирования как можно более сухим.

EDIT: Это оказалось многочастным ответом, и я принял подход использования комбинации Singleton и создания категории для NSString. Я поддержал большинство из вас, но я принял @Jack_Lawrence.

ответ

2

Мне нравится использовать категории Objective-C для такого рода вещей. Категории хороши для расширения возможностей существующих объектов, особенно объектов из фреймворков, которые вы не контролируете. Удостоверьтесь, что префикс имена методов, поэтому вы не противоречите текущим/будущим методам, которые Apple может реализовать.

В данном конкретном случае, я хотел бы создать категорию на NSDate называется NSDate + DateFormatting и реализовать метод, который возвращает NSString с датой приемника:

- (NSString *)JL_stringByFormattingDate 
{ 
    NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
    NSString *usFormatString = [NSDateFormatter dateFormatFromTemplate:@"EEE, MMM d YYY" options:0 locale:usLocale]; 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    formatter.dateFormat = usFormatString; 

    return [formatter stringFromDate:self.date]; 
} 
1

Обычно к объектам «широкого применения» можно отнести свойство, которое вы добавляете к делегату приложения.

Так создать NSDateFormatter и присвоить его свойство, которое можно ссылаться с вашего делегата через что-то вроде:

NSDateFormatter * myAppDateFormatter = nil; 
MyFineAppDelegate * myAppDelegate = (MyFineAppDelegate *)[[UIApplication sharedApplication] delegate]; 
if(myAppDelegate) 
{ 
    myAppDateFormatter = myAppDelegate.dateFormatter; 
} 
+0

Интересно. Перед тем, как вы ответили, я создал класс Singleton «DateUtilies», который, кажется, работает нормально. Скажете ли вы, что ваше решение является более подходящим или встроенным в лучшие практики iOS? –

+1

Я дал вам самый простой ответ (который, надеюсь, поможет другим людям встать на правильный путь, если они будут искать ваш вопрос по дороге). Ответ «Лучшая практика» здесь на самом деле очень субъективен и зависит от вашей реализации приложения, общей архитектуры MVC, вашего стиля и т. Д. –

+1

Вы не должны произвольно добавлять материал в AppDelegate. Это самая распространенная причина причины плохого проектирования программного обеспечения в проектах iOS. Продолжайте делать это, ваша в конечном итоге будет монолитный класс, который не имеет сплоченности. – lorean

1

классов Singleton являются одним из возможных решений. В принципе, везде, где вы вызываете объект, он возвращает тот же экземпляр. См. here для получения дополнительной информации и как это сделать.

2

Для таких вещей я всегда рекомендую использовать одиночка а не помещать функции в делегат приложения.

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

http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

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