दिलचस्प पोस्ट
कॉफी-बाइट्स कोड तह का उपयोग कैसे करें मैं form.Submit की प्रतिक्रिया कैसे कैप्चर कर सकता हूँ एकल बनाम डबल उद्धरण ('बनाम') डेलाइट सेविंग टाइम के दौरान स्थानीय समय पाने के लिए टाइम ज़ोन इन्फोस का उपयोग कैसे करें? सी में स्ट्रिंग से रिक्त स्थान निकालना? UIView में पारदर्शी छेद कट कैसे jquery में पाठ बॉक्स मूल्य सेट करने के लिए ब्लूटूथ के माध्यम से एंड्रॉइड + जोड़ी उपकरण प्रोग्रामेटिक रूप से सीएसएस 3 का उपयोग करके एसवीजी ड्रॉप साइड कैसे बूटस्ट्रैप modal खिड़की पूरी तरह से नष्ट करने के लिए? क्या HTML के दस्तावेज़ में एक नाम विशेषता अद्वितीय है? वसंत के साथ एक ठट्ठा JNDI डेटा स्रोत का परीक्षण कैसे करें? किसी पाठ फ़ाइल से विशिष्ट पंक्ति को हटाएं? फ़ाइल इतिहास को तोड़ने के बिना दो जीआईटी रिपॉजिटरी मर्ज करें अनक्यूट टाइप एरर: fs.readFileSync एक फ़ंक्शन नहीं है

स्विफ्ट 3 में कहां प्रेषण करें?

ठीक है, इसलिए मुझे एक्सकोड 8 में नए स्फीटी डिस्पैच एपीआई के बारे में पता चला। मुझे DispatchQueue.main.async का उपयोग करने में मज़ा आ रहा है, और मैं सभी नए एपीआई को खोजने के लिए एक्सकैप मॉड्यूल के आसपास ब्राउज़ कर रहा हूं।

लेकिन मैं यह भी सुनिश्चित करने के लिए dispatch_once का उपयोग करता हूं कि सिंगलटन सृजन और एक-बार सेटअप जैसी चीजें एक से अधिक बार निष्पादित नहीं की जा सकें (यहां तक ​​कि एक बहु-व्याध वातावरण में) … और dispatch_once कहीं न कहीं नए डिस्पैच मॉड्यूल में पाये जा सकते हैं?

 static var token: dispatch_once_t = 0 func whatDoYouHear() { print("All of this has happened before, and all of it will happen again.") dispatch_once(&token) { print("Except this part.") } } 

Solutions Collecting From Web of "स्विफ्ट 3 में कहां प्रेषण करें?"

स्विफ्ट 1.x के बाद से, स्विफ्ट ग्लोबल वैरिएबल और स्टैटिक प्रॉपर्टीज़ के थ्रेड-सुरक्षित आलसी आरंभीकरण के लिए दृश्यों के पीछे डिस्पैच_ऑन्स का उपयोग कर रहा है।

इसलिए ऊपर स्थित static var पहले से ही static var का उपयोग कर रहा dispatch_once , जो इसे अजीब बना देता है (और संभवतया दूसरे डिस्पैच_ऑनसी के लिए टोकन के रूप में इसका उपयोग करने के लिए समस्याग्रस्त है। वास्तव में इस तरह के पुनरावर्ती बिना प्रेषक_ऑनसी का उपयोग करने का कोई भी सुरक्षित तरीका नहीं है, इसलिए उन्हें मिल गया इसे से छुटकारा.इसके बजाय, उस पर निर्मित भाषा सुविधाओं का उपयोग करें:

 // global constant: SomeClass initializer gets called lazily, only on first use let foo = SomeClass() // global var, same thing happens here // even though the "initializer" is an immediately invoked closure var bar: SomeClass = { let b = SomeClass() b.someProperty = "whatever" b.doSomeStuff() return b }() // ditto for static properties in classes/structures/enums class MyClass { static let singleton = MyClass() init() { print("foo") } } 

तो यह सब महान है यदि आप एक बार प्रारंभ करने के लिए dispatch_once का उपयोग कर रहे हैं तो इसका परिणाम कुछ मान में होता है – आप उस वैल्यू को वैल्यूबल वैरिएबल या स्टैटिक प्रॉपर्टी बना सकते हैं जो आप आरंभ कर रहे हैं।

लेकिन क्या होगा यदि आप काम करने के लिए dispatch_once का उपयोग कर रहे हैं जिसका जरूरी नतीजा नहीं है? आप अभी भी वैश्विक वैरिएबल या स्थिर संपत्ति के साथ ऐसा कर सकते हैं: बस उस वेरिएबल के प्रकार को Void :

 let justAOneTimeThing: () = { print("Not coming back here.") }() 

और यदि एक वैश्विक चर या स्थैतिक संपत्ति तक एक बार काम करने के लिए उपयोग करना सही नहीं है तो आप को सही नहीं लगता – कहते हैं, आप चाहते हैं कि आप अपने क्लाइंट को अपनी लाइब्रेरी के साथ काम करने से पहले "इनिशियलाइज़ मे" फ़ंक्शन कॉल करें – बस इसे लपेटें किसी फ़ंक्शन में पहुंच:

 func doTheOneTimeThing() { justAOneTimeThing } 

अधिक के लिए माइग्रेशन मार्गदर्शिका देखें।

यहां और यहां के अन्य उत्तर बहुत अच्छे हैं, लेकिन मुझे लगता है कि यह थोड़ा tidbit भी उल्लेख किया जाना चाहिए:

dispatch_once बारे में अच्छी बात यह थी कि यह कैसे अनुकूलित किया गया था, अनिवार्य रूप से पहली बार चलाने के बाद कोड को संक्षेप में समझना था, जिसे मैं शायद ही समझता हूं, लेकिन काफी हद तक आश्वस्त हूँ कि यह सेटिंग (वास्तविक) वैश्विक टोकन की तुलना में अधिक तेजी से होगा।

हालांकि टोकई की चीज स्विफ्ट में उचित रूप से लागू की जा सकती है, हालांकि अभी तक एक और संग्रहित बुलियन घोषित करने की ज़रूरत नहीं है, यह सब बहुत अच्छा नहीं है। धागा-असुरक्षित का उल्लेख नहीं करने के लिए जैसा कि डॉक्टर बताता है, आपको "आलिया आरम्भिक वैश्विक" का उपयोग करना चाहिए। हाँ, लेकिन वैश्विक गुंजाइश क्यों चुप रहो, है ना?

जब तक कोई मुझे बेहतर तरीके से स्वीकार नहीं करता है, तब तक मैं अपना कार्य एक-बार बंद करने की घोषणा करता हूं, जिसमें मैं इसे प्रयोग कर रहा हूं, या उसके पास काफी निकट हूं, इस प्रकार है:

 private lazy var foo: Void = { // Do this once }() 

असल में मैं कह रहा हूं कि "जब मैं इसे पढ़ता हूँ, foo इस ब्लॉक को चलाने का नतीजा होना चाहिए।" यह ठीक उसी तरह से व्यवहार करता है जितना वैश्विक रूप से स्थिर होता है, ठीक दायरे में। और सुंदर फिर मैं इसे जहाँ भी चाहूँगा उसे कहूँगा, इसे किसी ऐसी चीज़ में पढ़कर जो कि कभी भी अन्यथा इस्तेमाल नहीं किया जाएगा मुझे उस के लिए स्विफ्ट की पसंद है इस तरह:

 _ = foo 

यह वाकई शांत चुटकी थोड़ी देर के आसपास रहा है, लेकिन बहुत प्यार नहीं देखा है। यह मूल रूप से रनटाइम पर अकेले चरम पत्तियां छोड़ देता है, जैसे कि एक अवांछित बंद होने तक, जब तक कि इसके Void परिणाम देखने को नहीं लगता। पढ़े जाने पर, इसे बंद कर दिया जाता है, इसे फेंक दिया जाता है और उसका परिणाम foo में रखता है। Void व्यावहारिक रूप से कुछ भी स्मृति-वार का उपयोग नहीं करता, इसलिए बाद में पढ़ा जाता है (यानी _ = foo ) CPU पर कुछ भी नहीं करता है (मुझे उस पर टिप्पणी न करें, किसी व्यक्ति को असेंबली की जांच करना सुनिश्चित करें!) जितना आप चाहें उतना करें, और स्विफ्ट मूल रूप से पहली बार चलाने के बाद इसके बारे में सोचना बंद कर देता है! उस पुराने dispatch_once_t खो दें, और अपने कोड को बहुत सुंदर रखें जैसा कि आप पहली बार क्रिसमस के दिन खोले!

मेरा एक मुद्दा यह है कि आप अपने पहले पढ़ने से पहले कुछ और करने के लिए foo सेट कर सकते हैं, और तब आपके कोड को कभी नहीं बुलाया जाएगा! इसलिए वैश्विक let स्थिर, जो कि रोकता है। बात यह है कि कक्षा के क्षेत्र में स्थिरांक self साथ अच्छी तरह खेलते नहीं हैं, इसलिए कोई आवृत्ति चर के साथ नहीं खेल रहा है … लेकिन गंभीरता से, आप किसी भी तरह Void लिए कब सेट करते हैं?

कि, और आपको वापसी प्रकार को Void या () रूप में निर्दिष्ट करने की आवश्यकता होगी, अन्यथा यह अभी भी self बारे में शिकायत करेगा कौन थैंक?

और lazy सिर्फ वैरिएबल को आलसी के रूप में बनाना है जैसा कि यह होना चाहिए, इसलिए स्विफ्ट इसे init() पर सीधे बंद नहीं करता है।

सुंदर snazzy, इतने लंबे समय के रूप में आप इसे करने के लिए लिखने के लिए याद नहीं! : पी

स्विफ्ट 3.0 में "dispatch_once" के लिए उदाहरण

चरण 1: बस सिंगलटन.swift (सिंगलटन क्लास) के साथ नीचे दिए गए कोड को बदलें

 // Singleton Class class Singleton: NSObject { var strSample = NSString() static let sharedInstance:Singleton = { let instance = Singleton () return instance } () // MARK: Init override init() { print("My Class Initialized") // initialized with variable or property strSample = "My String" } } 

सिंगलटन नमूना छवि

चरण 2: व्यू नियंत्रक.swift से सिंगलटन को कॉल करें

 // ViewController.swift override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let mySingleton = Singleton.sharedInstance print(mySingleton.strSample) mySingleton.strSample = "New String" print(mySingleton.strSample) let mySingleton1 = Singleton.sharedInstance print(mySingleton1.strSample) } 

ViewController नमूना छवि

इस तरह से आउटपुट

 My Class Initialized My String New String New String 

एक्सकोड 8 जीए स्विफ्ट 3 के तहत कंपाइल्स

एक डिस्पैच_ऑनसी सिंगलटन क्लास इंस्टेंस बनाने की अनुशंसित और सुरुचिपूर्ण तरीके:

 final class TheRoot { static let shared = TheRoot() var appState : AppState = .normal ... 

इसके प्रयेाग के लिए:

 if TheRoot.shared.appState == .normal { ... } 

ये रेखाएं क्या करती हैं?

अंतिम – तो कक्षा को ओवरराइड नहीं किया जा सकता, विस्तारित किया जा सकता है, यह कोड को चलाने के लिए कुछ हद तक तेज बनाता है, कम इन्डरेक्शन।

स्थैतिक साझा साझा = TheRoot () – यह लाइन आलसी init है, और यह केवल एक बार चलाता है।

यह समाधान धागा सुरक्षित है

जबकि "आलसी वारा" पैटर्न मुझे प्रेषण टोकन के बारे में देखभाल करने की अनुमति देता है और आमतौर पर प्रेषक_ऑनसी की तुलना में अधिक सुविधाजनक है, मुझे यह पसंद नहीं है कि यह कॉल साइट पर कैसे दिखता है:

 _ = doSomethingOnce 

मैं इस कथन को फ़ंक्शन कॉल की तरह अधिक देखने की उम्मीद करता हूं (क्योंकि यह क्रिया का अर्थ है), लेकिन यह बिल्कुल बिल्कुल नहीं दिखता है। इसके अलावा, स्पष्ट रूप से परिणाम को त्यागने के लिए _ = लिखना _ = और कष्टप्रद है।

एक बेहतर रास्ता है:

 lazy var doSomethingOnce: () -> Void = { print("executed once") return {} }() 

जो निम्न संभव बनाता है:

 doSomethingOnce() 

यह कम कुशल हो सकता है (चूंकि यह Void रद्द करने के बजाय रिक्त समापन कॉल करता है), लेकिन बेहतर स्पष्टता मेरे लिए पूरी तरह लायक है।

प्रवासन मार्गदर्शिका के अनुसार:

स्विफ्ट में मुफ्त फ़ंक्शन प्रेषण_ऑन्सेस उपलब्ध नहीं है। स्विफ्ट में, आप आलसी प्रारंभिक गोलार्ध या स्थैतिक गुणों का उपयोग कर सकते हैं और उसी धागा-सुरक्षा प्राप्त कर सकते हैं और जिसे कभी-कभी डिस्पैच_ऑन्स प्रदान की जाती है

उदाहरण:

  let myGlobal = { … global contains initialization in a call to a closure … }() // using myGlobal will invoke the initialization code only the first time it is used. _ = myGlobal