swift - Swift,NSDateFormatter的最佳实践是什么?

  显示原文与译文双语对照的内容
0 0

我是 Swift 新手,我对 Objective C 非常陌生。 谁能帮我把这个转换成 Swift? 我从 Wenderlich iOS的最佳实践中得到了这段代码,实践 http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks 。

你将把这个代码放在哪里? 在类文件中充满全局变量?

如果某人有一个比下面发布的更好的解决方案,我愿意看到它 !


- (NSDateFormatter *)formatter {
 static NSDateFormatter *formatter;
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
 _formatter = [[NSDateFormatter alloc] init];
 _formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";//twitter date format
 });
 return formatter;
}

时间: 原作者:

0 0
  1. 如果你真的在问题中寻找简单的模拟方法,你可以执行以下操作:

    
    var formatter: NSDateFormatter {
     struct Static {
     static let instance : NSDateFormatter = {
     let formatter = NSDateFormatter()
     formatter.dateFormat ="EEE MMM dd HH:mm:ss Z yyyy"
     return formatter
     }()
     }
    
     return Static.instance
    }
    
    

    具有结构的static 成员,如全局,享受它的默认值的dispatch_once 行为。 详细信息,请参阅文件末尾的dispatch_once 讨论和apple博客中的初始化条目:

    全局变量( 。结构和枚举的static 成员)的延迟初始值设定项首次被访问,并作为 dispatch_once 启动,以确保初始化为原始。 这样就可以在代码中使用 dispatch_once 了: 用初始值设定项声明一个全局变量 [or static member of struct] 并将它的标记为 private 。

  2. 关于日期格式化程序的最佳实践,我建议:

    • 是的,谨慎地创建和销毁你可能需要的格式化程序是明智的。 在 WWDC 2012视频中, iOS应用性能: 苹果的React性,苹果明确鼓励我们

      • 对每个日期格式缓存一个格式化程序

      • 使 NSLocaleDidChangeNotification 上的缓存无效

      • 设置格式与重新创建一样昂贵,因此不要重用格式化程序,而是更改它的格式字符串

    • 根据线程安全摘要线程编程指南该日期格式化程序not线程安全 safe 。 因此,确保在多个线程( 。至少不需要同步访问) 中不要使用相同的格式化程序。

实际的结论是,应该重用日期格式化程序,它的中使用同一日期格式的大量( 一个很好的例子是在 UITableView的行中重复格式化日期,或者解析一个使用同一日期格式的json/xml响应。) 。 但是要谨慎地在多个线程之间不使用同一格式化程序。

对于我来说,我不倾向于在日期格式器中使用单例对象。 但是我将看到我的代码,并且在同一个上下文中将同一个格式化程序很快地使用同一个格式化程序。 一般我用一个简单的类属性实现这个。 但在某些情况下,我使用了静态( 如你的objective-c 示例或者我的Swift 示例,) 。 这取决于特定的场景,平衡重用和其他因素。

原作者:
0 0

你可以这样做,把 NSDateFormatteronceToken 移到你的函数之外。 然后,你可以像在示例中那样进行操作:


var theFormatter:NSDateFormatter!
var token: dispatch_once_t = 0
func formatter() ->NSDateFormatter {
 dispatch_once(&token) {
 theFormatter = NSDateFormatter()
 theFormatter.dateFormat ="EEE MMM dd HH:mm:ss Z yyyy"
 }
 return theFormatter

}

但是就像建议,你应该看一下ispatch_once单个问题

原作者:
0 0

我试图在这里应用单例方法( 在这里找到了 ) 。 这将创建一个可以加载在应用程序中使用不同格式的单例。 例如你可以使用 formatter.fromDateTime(myString) 在应用程序的任何地方访问它


let formatter = FormatterFormats()

class FormatterFormats {
 var dateTime: NSDateFormatter = NSDateFormatter()

 class var sharedInstance:FormatterFormats {
 return formatter
 }

 func fromDateTime(dateString: String) -> NSDate {
 return dateTime.dateFromString(dateString)!
 }

 init() {
 dateTime.dateFormat ="yyyy-MM-dd'T'HH:mm:ss.SSSZ"
 }

}

原作者:
...