在典型的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];
我希望尽可能将格式代码保留为DRY。
编辑:原来这是一个多部分的答案,我采用的方法是使用Singleton的组合并为NSString创建一个Category。我赞成你们大多数人,但我接受了@Jack_Lawrence。
答案 0 :(得分: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 :(得分:2)
对于这样的事情,我总是建议使用单例,而不是将函数放在app委托中。
以下文章非常清楚地介绍了如何使用单身人士及其优势。
http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
答案 2 :(得分:1)
通常,“应用程序范围”对象可以通过您添加到应用程序委托的属性来引用。
因此,创建一个NSDateFormatter
并将其分配给您可以通过以下内容从代理中引用的属性:
NSDateFormatter * myAppDateFormatter = nil;
MyFineAppDelegate * myAppDelegate = (MyFineAppDelegate *)[[UIApplication sharedApplication] delegate];
if(myAppDelegate)
{
myAppDateFormatter = myAppDelegate.dateFormatter;
}
答案 3 :(得分:1)
Singleton类是一种可能的解决方案。基本上,无论您从何处调用该对象,它都将返回相同的实例。有关更多信息和方法,请参阅here。