2015-02-13 9 views
20

मैं तेजी से नया हूं और उद्देश्य-सी से बहुत अपरिचित हूं। क्या कोई इसे स्विफ्ट में बदलने में मेरी मदद कर सकता है? मुझे रे वेंडरलिच के सर्वोत्तम आईओएस प्रथाओं से यह कोड मिला - http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricksस्विफ्ट में एक NSDateFormatter बनाना?

आप यह कोड कहां रखेंगे? क्या यह वैश्विक चर से भरा वर्ग फ़ाइल में जाएगा?

- (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

[स्विफ्ट में प्रेषण \ _once सिंगलटन मॉडल] के संभावित डुप्लिकेट (

मैं (स्विफ्ट 2.0 में परीक्षण कोड) NSDate और NSDateFormatter के विस्तार के रूप में यह कर रहा हूं http://stackoverflow.com/questions/24024549/dispatch-once-singleton-model-in-swift) –

+0

डुप्लिकेट दिखाता है कि कैसे तेजी में एक सिंगलटन मॉडल लागू करने के लिए, लेकिन लब्बोलुआब यह है कि स्थैतिक चर स्वचालित रूप से lazily का उपयोग कर प्रारंभ हो रहा है कोड dispatch_once द्वारा संरक्षित। –

उत्तर

49
  1. साथ यहां पहुंच सकता है अगर तुम सच में अपने प्रश्न में विधि के लिए सीधी एनालॉग लिए देख रहे हैं स्विफ्ट 3 में आप की तरह कुछ कर सकता है:

    class MyObject { 
    
        // define static variable 
    
        private static let formatter: DateFormatter = { 
         let formatter = DateFormatter() 
         formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy" 
         return formatter 
        }() 
    
        // you could use it like so 
    
        func someMethod(date: Date) -> String { 
         return MyObject.formatter.string(from: date) 
        } 
    } 
    

    या स्विफ्ट 2 में:

    class MyObject { 
    
        // define static variable 
    
        private static let formatter: NSDateFormatter = { 
         let formatter = NSDateFormatter() 
         formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy" 
         return formatter 
        }() 
    
        // you could use it like so 
    
        func someMethod(date: NSDate) -> String { 
         return MyObject.formatter.stringFromDate(date) 
        } 
    } 
    

    static गुण, जैसे ग्लोबल्स, dispatch_once उनके डिफ़ॉल्ट मानों के लिए व्यवहार का आनंद लें। अधिक जानकारी के लिए, एप्पल के स्विफ्ट ब्लॉग में Files and Initialization प्रविष्टि के अंत में dispatch_once चर्चा देखें।

  2. तारीख formatters साथ सर्वोत्तम प्रथाओं के बारे में, मेरा सुझाव है:

    • हाँ, यह अनावश्यक रूप से बना सकते हैं और formatters कि आप फिर से आवश्यकता होती है को नष्ट नहीं समझदारी है। WWDC 2012 वीडियो, iOS App Performance: Responsiveness, एप्पल स्पष्ट रूप से हमारे लिए

      • कैश दिनांक स्वरूप प्रति एक फ़ॉर्मेटर प्रोत्साहित करती है; स्विफ्ट 3 में NSLocale.currentLocaleDidChangeNotification (NSCurrentLocaleDidChangeNotification स्विफ्ट 2 में) के लिए

      • जोड़ें पर्यवेक्षक NSNotificationCenter के माध्यम से, और समाशोधन/कैश की गई formatters को रीसेट यदि ऐसा होता है; और

      • ध्यान दें कि एक प्रारूप को रीसेट करना उतना महंगा है जितना पुनर्निर्माण के रूप में, इसलिए बार-बार एक फॉर्मेटर प्रारूप स्ट्रिंग को बदलने से बचें।

      नीचे पंक्ति, पुन: उपयोग दिनांक स्वरूपक जहां भी संभव हो, यदि आप बार-बार उसी प्रारूप प्रारूप का उपयोग कर रहे हैं।

    • NSDateFormatter का उपयोग कर तिथि तार पार्स करने के लिए एक वेब सेवा के साथ आदान-प्रदान किया जा करने के लिए है (या एक डेटाबेस में संग्रहीत), तो आपको en_US_POSIX स्थान का उपयोग करने वाले ग्रेगोरियन कैलेंडर का उपयोग नहीं किया जा सकता है अंतरराष्ट्रीय उपयोगकर्ताओं के साथ समस्याओं से बचने के लिए करना चाहिए। Apple Technical Q&A #1480 देखें।

      लेकिन जब NSDateFormatter/DateFormatter साथ dateFormat का उपयोग कर (या आईओएस 10 और MacOS 10.12 में, ISO8601DateFormatter का उपयोग करें।), तार बनाने अंत उपयोगकर्ता के लिए प्रस्तुत किए जाने के लिए वर्तमान स्थान का उपयोग करें, लेकिन en_US_POSIX स्थानीय जब बनाने/पार्स करने तार का उपयोग ऐप के भीतर आंतरिक रूप से इस्तेमाल किया जाना चाहिए या वेब सेवा के साथ आदान-प्रदान किया जाना चाहिए।

    • यदि उपयोगकर्ता इंटरफ़ेस के लिए स्वरूपण दिनांक स्ट्रिंग्स हैं, तो संभव हो तो dateFormat के लिए स्ट्रिंग अक्षर का उपयोग करके टालने से तारों को स्थानीयकृत करें। dateStyle और timeStyle का उपयोग करें जहां आप कर सकते हैं। और यदि आपको कस्टम dateFormat का उपयोग करना होगा, तो अपने तारों को स्थानांतरित करने के लिए टेम्पलेट का उपयोग करें। स्विफ्ट 2, dateFormatFromTemplate(_:options:locale:) में

      formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "EdMMM", options: 0, locale: Locale.current) 
      

      या:: उदाहरण के लिए, के बजाय हार्ड-कोड E, MMM d, स्विफ्ट 3 में, आप dateFormat(fromTemplate:options:locale:) का प्रयोग करेंगे

      formatter.dateFormat = NSDateFormatter.dateFormatFromTemplate("EdMMM", options: 0, locale: NSLocale.currentLocale()) 
      

      यह स्वचालित रूप से उदाहरण के लिए दिखाई देगा, "सोम , 5 सितंबर "अमेरिकी उपयोगकर्ताओं के लिए, लेकिन यूके उपयोगकर्ताओं के लिए" सोम 5 सितंबर "।

    • NSDateFormatter अब आईओएस 7 और बाद में 64-बिट ऐप्स मैकोज़ 10.9 और बाद में चल रहे थ्रेड पर सुरक्षित है।

+0

या बेहतर अभी तक 'समारोह someMethod (NSDate तारीख) डाल दिया। –

+0

पहले भाग में, क्या हम इसे सिर्फ एक निजी बनाने नहीं दे सकते? निजी स्थिर के बजाय चलो? सबसे पहले, मैं ऑप्स सवाल है, जिसमें वे 'static' का उपयोग का जवाब दे रहा था, इसलिए मैं एक ही कर रहा था - कि –

+1

@ShabarinathPabba के लिए क्या कारण है। दूसरा, विचार है कि आप तत्काल दिनांक स्वरूपों की संख्या को कम करें। तो यह एक प्रकार संपत्ति बनाकर, यह सुनिश्चित करता है कि आप कितने 'MyObject' इंस्टेंस की परवाह किए बिना, आप केवल एक फ़ॉर्मेटर होगा। लेकिन अगर आप किसी वर्ग में हैं जिसके लिए आप जानते हैं कि आपके पास केवल 'मायऑब्जेक्ट' का एक उदाहरण होगा, तो सुनिश्चित करें कि संपत्ति टाइप करने के बजाए इंस्टेंस प्रॉपर्टी का उपयोग करें। अपने स्वयं के अच्छे फैसले का प्रयोग करें जो सुनिश्चित करता है कि आप अनावश्यक रूप से कई अनावश्यक दिनांक स्वरूपण को तुरंत चालू नहीं करते हैं। – Rob

0

आपको लगता है कि जैसे कि यह करना है और NSDateFormatter और अपने समारोह के बाहर ले जाने के onceToken सकता है। तो फिर आप इसे अपने उदाहरण की तरह कर सकते हैं:

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 

} 

लेकिन जैसे David सुझाव दिया, तुम घ ispatch_once singleton question पर एक नज़र रखना चाहिए।

1

मैंने सिंगलटन दृष्टिकोण को here पर लागू करने का प्रयास किया है। यह एक सिंगलटन बनाता है जिसे आपके आवेदन के भीतर उपयोग किए जाने वाले विभिन्न प्रारूपों के साथ लोड किया जा सकता है। उदाहरण के लिए, आप इसे कहीं भी अपने आवेदन में 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" 
    } 

} 
+0

@rob क्षमा करें, मैं पालन नहीं करता हूं। क्या मेरा कोड स्थिर सदस्यों का उपयोग करके बेहतर होगा? यदि हां, तो यह कैसा दिखता है? –

+0

सिंगलटन पैटर्न आम तौर पर है 'अंतिम वर्ग FormatterFormats {स्थिर देना साझा = FormatterFormats()}'। यह वैश्विक नामस्थान प्रदूषण से बचाता है। अन्य मामलों को गलती से तत्काल करने से बचने के लिए आपको शायद 'इनिट' को 'निजी' होने के लिए भी परिभाषित करना चाहिए। एक NSDate विस्तार में> स्ट्रिंग' -: – Rob

18

Rob के रूप में कहा, तुम, प्रदर्शन बनाने DateFormatters साथ सावधान रहना चाहिए कि WWDC सत्र से युक्तियों का उपयोग।

extension NSDate { 
    func PR2DateFormatterUTC() -> String { 
     return NSDateFormatter.PR2DateFormatterUTC.stringFromDate(self) 
    } 
    //... more formats 
} 

extension NSDateFormatter { 
    private static let PR2DateFormatterUTC: NSDateFormatter = { 
     let formatter = NSDateFormatter() 
     let timeZone = NSTimeZone(name:"UTC") 
     formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
     formatter.timeZone = timeZone 
     return formatter 
    }() 
    //... more formats 
} 

उपयोग::

let dateStringUTC = NSDate().PR2DateFormatterUTC() 
+1

आप 'प्राइवेट स्टैटिक लेट' का भी उपयोग कर सकते हैं – Hlung

+0

बदल गया, – PabloR

+1

निजी के लिए धन्यवाद मेरे लिए काम नहीं कर रहा है ... लेकिन स्निपेट के लिए धन्यवाद और धन्यवाद @Rob भी – Matz

संबंधित मुद्दे