2016-07-25 17 views
3

Ich habe einige Leistungsprobleme in meiner iOS-App während der Umwandlung von Daten, die in einem 2013-12-19 00:00:00.000000 Format zu einem Medium Datum (Dec 25, 2014) und zu einem doppelten Wert (Epoche) kommen. Laut dem Xcode-Profiler benötigen die beiden Funktionen, die diesen Prozess durchführen, ungefähr 60% meiner Ausführungszeit. Ich würde gerne wissen, wie man diesen Code verbessert oder ob es einen effizienteren Weg gibt, um was ich bekomme brauchen.Leistungsprobleme beim Analysieren von Daten

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

Das Erstellen von Datumsformatierern und das Festlegen der Eigenschaft 'dateFormat' sind kostspielige Operationen. Erstellen Sie jeden Datumsformatierer einmal und speichern Sie ihn in einer statischen Eigenschaft und verwenden Sie sie erneut. – dan

Antwort

6

NSDateFormatter ist notorisch langsam. Sie sollten es einmal erstellen, zwischenspeichern und die gleiche Instanz wiederverwenden, anstatt jedes Mal eine neue Instanz zu erstellen.

Zum Beispiel können Sie folgendes tun:

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

Auf iOS 7 und höher ist 'NSDateFormatter' threadsicher. - 'Thread Safety' Kapitel von https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/index.html#//apple_ref/occ/cl/NSDateFormatter –

+0

Netter Fang, danke @EvgenyKarkan – dannyzlo

+0

wie würdest du es benutzen? mit einer Art Getter? Könntest du mir ein Beispiel geben? – ur3k

4

Erstellen NSDateFormatter Instanz - ist eine komplexe CPU aufwendige Aufgabe.
Es ist besser, es einmal zu verwenden oder eine gemeinsame Instanz zu erstellen.

einen Blick auf diesen Thread Nehmen Sie am besten NSDateFormatter Praktiken beschreiben - Whats the best practice for NSDateFormatter in Swift?

Auch auf diese mehr Informationen, die Sie in Data Formatting Guide von Apple finden Sie unter:

Erstellen

Cache Formatter für Effizienz Ein Datumsformatierer ist keine billige Operation. Wenn Sie häufig einen Formatierer verwenden, ist es normalerweise effizienter, eine einzelne Instanz zwischenzuspeichern, als mehrere Instanzen zu erstellen und zu verwerfen. Ein Ansatz besteht darin, eine statische Variable zu verwenden.

Also, Ihren Code Refactoring - sollten Sie Initialisierung von 3 NSDataFormatter Instanzen mit der Funktion ersetzen, die INiTS und gibt nur 1 Instanz geteilt (1 Speicheradresse), dann wieder Instanz.

+0

Vielen Dank für Ihre Antwort, es ist die richtige Antwort, aber Danny Zlobinsky antwortete zuerst. Ich werde trotzdem die Antwort abstimmen. – ur3k