共享 NSDateFormatter - 最佳实践?

Posted

技术标签:

【中文标题】共享 NSDateFormatter - 最佳实践?【英文标题】:Shared NSDateFormatter - Best Practices? 【发布时间】:2011-06-20 17:57:54 【问题描述】:

我的团队发现我们在整个代码库中使用了各种 NSDateFormatter 对象,并开始研究如何避免在一堆不同的地方分配/初始化通用格式化程序的成本/混乱。

我们的一个想法是在NSDateFormatter 类上创建一个类别,该类别将提供对通常配置的格式化程序的静态实例的引用。例如,我们在几个地方使用“短时间”日期格式化程序,并希望添加以下类方法:

@implementation NSDateFormatter (NSDateFormatter_PDDateFormatters)

static NSDateFormatter * shortTimeFormatter = nil;

+ (NSDateFormatter *) PDSharedShortTimeFormatter 

    @synchronized([NSDateFormatter class])

        if( shortTimeFormatter == nil)

           // Create new formatter for SHORT times (e.g. 12:00 pm)

           shortTimeFormatter = [[NSDateFormatter alloc] init];
           [shortTimeFormatter setDateStyle: NSDateFormatterNoStyle];
           [shortTimeFormatter setTimeStyle:NSDateFormatterShortStyle];
       

      return shortTimeFormatter;

   

  return nil;


@end

我在使用这种方法时遇到的一个问题是,我们目前没有“保护”NSDateFormatter 不被更改。由于格式化程序本质上是在整个应用程序中“共享”的,如果另一个对象要更改格式化程序的配置(例如时间/日期样式),这可能会导致问题。

因为我们在内部使用此功能,所以我不太担心我们的团队滥用此功能的风险(即,它是一个小团队,并且已明确评论)。

但是,我想知道这里的最佳做法。

有没有办法返回对日期格式化程序的不可变引用?如果我返回一个格式化程序的副本,这是否比我们现在正在做的分配/初始化更便宜?

这里有其他方法可以采取吗?

我们将着手进行这项工作,但在编写“更好”的代码时获得一些反馈总是好的。

【问题讨论】:

【参考方案1】:

通常,您不会担心它。 Obj-C 可以让你摆弄几乎任何东西的多汁内部。甚至@private 也不能防止-valueForKey:_thatFunPrivateIvar。如果一切都失败了,你可以调用运行时函数。

但是,这里最简单的解决方法是公开一个在内部使用缓存格式化程序的 API,但不能访问它正在使用的格式化程序。然后,您的代码将使用 +[Formatter shortTimeStringFromDate:] 来执行您的示例代码现在正在执行的操作。有问题的格式化程序可以被延迟分配,您可以使用可清除内存,这样缓存的格式化程序可以在内存压力下以 LRU 方式清除。

【讨论】:

在这种特殊情况下,我还考虑将“公共”API 添加到 NSDate 类:[date PDShortTime]。然后,缓存的NSDateFormatter 对象只能在后台访问。感谢您的回答! 这也可以作为 NSString 上的一个类别 ie/ [NSString shortTimeFromDate:] “别担心”不是可行的方法:意外修改对象非常容易。绝对做解决方法,这是一个很好的解决方案。

以上是关于共享 NSDateFormatter - 最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

处理 NSDateFormatter 语言环境“feehur”的最佳方法是啥?

React 代码共享最佳实践方式

使用共享库版本支持不同 ABI 的最佳实践是啥?

共享 Android/iOS 开发的最佳实践

最佳实践——在应用之间共享 Spring-boot Service 和 Repo 层代码

使用共享库时 Yarn 工作区的最佳实践