2016-07-25 89 views
3

我在iOS应用程序中遇到了一些性能问题,同时将2013-12-19 00:00:00.000000格式的日期转换为中等样式日期(Dec 25, 2014)和双值(epoch)。根据Xcode分析器,执行此过程(波纹管)的两个函数大约占我执行时间的60%解析日期时的性能问题

我想知道如何改进此代码或者是否有更有效的方法来获取我需要。

static func getMediumDate(dateString: String) -> (NSString)? { 

    // Get the: yyyy-MM-dd 
    let shorDate = dateString[dateString.startIndex..<dateString.startIndex.advancedBy(10)] 

    let dateFormatter = NSDateFormatter() 
    dateFormatter.locale = NSLocale(localeIdentifier: "en_US") 
    dateFormatter.dateFormat = "yyyy-MM-dd" 

    let stringFormatter = NSDateFormatter() 
    stringFormatter.locale = NSLocale(localeIdentifier: "en_US") 
    stringFormatter.dateFormat = "yyyy-MM-dd" 
    stringFormatter.dateStyle = .MediumStyle 

    let newDate = dateFormatter.dateFromString(shorDate) 

    if (newDate != nil){ 
     return stringFormatter.stringFromDate(newDate!) 
    }else{ 
     return nil 
    } 
} 

static func getSortDate(dateString:String) -> Double{ 

    // Get the: yyyy-MM-dd 
    let shorDate = dateString[dateString.startIndex..<dateString.startIndex.advancedBy(10)] 

    let dateFormatter = NSDateFormatter() 
    dateFormatter.locale = NSLocale(localeIdentifier: "en_US") 
    dateFormatter.dateFormat = "yyyy-MM-dd" 

    let newDate = dateFormatter.dateFromString(shorDate) 

    let value = newDate?.timeIntervalSince1970 

    if value < DBL_MIN{ 
     return 0 
    }else if value > DBL_MAX{ 
     return DBL_MAX 
    }else if value != nil{ 
     return value! 
    }else{ 
     return 0 
    } 
} 
+0

创建日期格式化程序并设置'dateFormat'属性是昂贵的操作。创建每个日期格式化程序一次并将其存储在一个静态属性中并重用它们。 – dan

回答

6

NSDateFormatter是臭名昭着的缓慢。您应该创建一次,缓存并重复使用相同的实例,而不是每次创建一个新实例。

例如,你可以做到以下几点:

extension NSDateFormatter { 
    private static let standardDateFormatter: NSDateFormatter = { 
     let dateFormatter = NSDateFormatter() 
     dateFormatter.locale = NSLocale(localeIdentifier: "en_US") 
     dateFormatter.dateFormat = "yyyy-MM-dd" 
     return dateFormatter 
    }() 
} 
+1

在iOS 7及更高版本中,“NSDateFormatter”是线程安全的。 - 来自https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/index.html#//apple_ref/occ/cl/NSDateFormatter的“线程安全”章节 –

+0

好的接收,谢谢@EvgenyKarkan – dannyzlo

+0

你会如何使用它?与某种吸气剂?你能举个例子吗? – ur3k

4

创建NSDateFormatter实例 - 是一个复杂的CPU耗时的任务。
最好使用一次或创建共享实例。

看看这个线程描述最佳NSDateFormatter实践 - Whats the best practice for NSDateFormatter in Swift?

而且这方面的更多信息,你可以在Data Formatting Guide从苹果发现:

的效率

创建缓存格式化程序日期格式化程序不是一个便宜的操作。如果您可能经常使用格式化程序,则缓存单个实例通常比创建和处理多个实例更高效。一种方法是使用静态变量。

因此,重构你的代码 - 你应该取代与inits并返回只有1共享实例(1个内存地址)功能3个NSDataFormatter实例的初始化,然后使用返回的实例。

+0

非常感谢您的回答,这是正确的答案,但Danny Zlobinsky首先回答。不过,我会投票答复。 – ur3k