दिलचस्प पोस्ट
क्या मुझे <class> तत्वों को persistence.xml की आवश्यकता है? PHP में यूआरएल के अनुकूल यूजरनाम? मैं एसक्यूएल में एक महीने के पहले दिन कैसे चुन सकता हूं? बाएं किनारे के संचालन में नकारात्मक मूल्य क्यों है? MySQL में लॉकिंग के बिना चयन करने का कोई भी तरीका? विस्तार विधियां कैसे काम करती हैं? सदस्य फ़ंक्शन के साथ धागा प्रारंभ करें वास्तुकला MVC की तुलना में वेब एप्लिकेशन के लिए अधिक उपयुक्त है? एंड्रॉइड में एक अनुरोध में एक छवि और ऑडियो अपलोड करें जावा में स्ट्रिंग को JSONObject में कैसे परिवर्तित किया जाए सरणी नाम के बिना JSONArray प्राप्त करें? मैं जावा में विधि का निष्पादन कैसे करता हूं? एक स्ट्रिंग एन्क्रिप्ट और डिक्रिप्ट करें डेटाबेस खोला नहीं जा सकता क्योंकि यह संस्करण 782 है। यह सर्वर संस्करण 706 और पहले का समर्थन करता है। डाउनग्रेड पथ समर्थित नहीं है आर में एक उपयोगी डेटा फ्रेम में विभिन्न लंबाई के सदिश की सूची को कैसे परिवर्तित करें?

आईफोन – ग्रांड सेंट्रल डिस्पैच मुख्य धागा

मैं सफलता के साथ प्रयोग कर रहा था, मेरे क्षुधा में भव्य केंद्रीय प्रेषण, लेकिन मैं सोच रहा था कि इस तरह से कुछ का उपयोग करने का वास्तविक लाभ क्या है:

dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff 

या और भी

 dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff 

मेरा मतलब है, दोनों मामलों में आप मुख्य थ्रेड पर क्रियान्वित होने वाले एक ब्लॉक को फायरिंग कर रहे हैं, ठीक उसी तरह जहां ऐप चलता है और यह लोड को कम करने में मदद नहीं करेगा। पहले मामले में आपके पास कोई नियंत्रण नहीं है जब ब्लॉक चल जाएगा। मैंने देखा है कि उनको आग लगाने के बाद ब्लॉक के मामले आधे से दूसरे के अंजाम किए जाते हैं। दूसरा मामला, यह समान है

 [self doStuff]; 

सही?

मुझे आश्चर्य है कि आप लोग क्या सोचते हैं

वेब के समाधान से एकत्रित समाधान "आईफोन – ग्रांड सेंट्रल डिस्पैच मुख्य धागा"

मुख्य कतार में किसी ब्लॉक को प्रेषित करना आमतौर पर एक पृष्ठभूमि कतार से किया जाता है ताकि संकेत मिलता है कि कुछ पृष्ठभूमि प्रसंस्करण उदास हो चुका है

 - (void)doCalculation { //you can use any string instead "com.mycompany.myqueue" dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0); dispatch_async(backgroundQueue, ^{ int result = <some really long calculation that takes seconds to complete>; dispatch_async(dispatch_get_main_queue(), ^{ [self updateMyUIWithResult:result]; }); }); } 

इस मामले में, हम एक पृष्ठभूमि कतार पर एक लंबी गणना कर रहे हैं और गणना पूरी होने पर हमारे यूआई को अपडेट करने की आवश्यकता है। सामान्य रूप से UI को अपडेट करना मुख्य कतार से किया जाना चाहिए ताकि हम दूसरी नीडिंत डिस्पैच_आसिंक का उपयोग करके मुख्य कतार में वापस संकेत कर सकें।

संभवत: अन्य उदाहरण हैं जहां आप मुख्य कतार में वापस भेजना चाहते हैं, लेकिन आम तौर पर इस तरह से किया जाता है, जो किसी ब्लॉक के भीतर से एक पृष्ठभूमि कतार में प्रेषित होता है।

  • पृष्ठभूमि प्रसंस्करण समाप्त -> अद्यतन UI
  • पृष्ठभूमि कतार पर संसाधित किए गए डेटा का हिस्सा -> अगला हिस्सा शुरू करने के लिए मुख्य कतार संकेत करें
  • पृष्ठभूमि कतार पर आने वाले नेटवर्क डेटा -> सिग्नल मुख्य कतार जो संदेश आ गया है
  • आदि आदि

जैसा कि आप मुख्य कतार से मुख्य कतार में क्यों भेजना चाहते हैं … ठीक है, आप आमतौर पर ऐसा नहीं कर सकते हैं, हालांकि संभवतः आप ऐसा कुछ समय के लिए रन लूप के आसपास कुछ काम करने के लिए कर सकते हैं।

मुख्य धागे से मुख्य कतार में अवरोधन करना उपयोगी हो सकता है। यह मुख्य कतार को अन्य ब्लॉकों को संभालने का एक मौका देता है जो कि कतारबद्ध है ताकि आप केवल सब कुछ को क्रियान्वित करने से अवरुद्ध न कर सकें।

उदाहरण के लिए आप एक अनिवार्य रूप से एकल थ्रेडेड सर्वर लिख सकते हैं जो फिर भी कई समवर्ती कनेक्शन हैंडल करता है। जब तक कतार में कोई भी व्यक्ति ब्लॉक लंबे समय तक लेता नहीं है, सर्वर नए अनुरोधों के प्रति उत्तरदायी रहता है।

यदि आपका कार्यक्रम कुछ भी नहीं करता है, लेकिन अपने पूरे जीवन को घटनाओं का जवाब देने में खर्च करता है तो यह काफी स्वाभाविक हो सकता है। आप अपने ईवेंट संचालकों को मुख्य कतार में चलाने के लिए बस सेट अप करते हैं और फिर डिस्पैच_मेन () कॉल करते हैं, और आपको थ्रेड सुरक्षा के बारे में बिल्कुल चिंता करने की जरूरत नहीं पड़ती है।

उम्मीद है कि मैं आपके प्रश्न को सही ढंग से समझ रहा हूं, जिसमें आप dispatch_async और dispatch_sync के बीच अंतर के बारे में सोच रहे हैं?

 dispatch_async 

ब्लॉक को एक कतार में एसिंक्रोनस रूप से प्रेषित करेगा इसका अर्थ यह ब्लॉक को कतार में भेज देगा और आपके विधि में शेष कोड के निष्पादन को जारी रखने से पहले इसे वापस लेने की प्रतीक्षा नहीं करेगा।

 dispatch_sync 

ब्लॉक एक कतार में synchronously प्रेषण होगा यह विधि में शेष कोड के किसी भी अधिक निष्पादन को रोक देगा, जब तक कि ब्लॉक निष्पादित नहीं हो रहा है।

मैं मुख्य रूप से मुख्य कतार से काम पाने के लिए एक dispatch_async को एक पृष्ठभूमि कतार में उपयोग किया है dispatch_async डिवाइस के किसी भी अतिरिक्त कोर का लाभ उठा सकते हैं। फिर मुख्य थ्रेड पर डिस्पैच_असिनक अगर मुझे UI अपडेट करने की आवश्यकता है I

सौभाग्य

यूआई गतिविधियों के लिए एक जगह है जहां यह उपयोगी है, जैसे कि एक लंबा ऑपरेशन करने से पहले स्पिनर की स्थापना करना:

 - (void) handleDoSomethingButton{ [mySpinner startAnimating]; (do something lengthy) [mySpinner stopAnimating]; } 

काम नहीं करेगा, क्योंकि आप मुख्य धागा को अपनी लंबी चीज़ के दौरान अवरुद्ध कर रहे हैं और UIKit को वास्तव में स्पिनर शुरू नहीं करने दे।

 - (void) handleDoSomethingButton{ [mySpinner startAnimating]; dispatch_async (dispatch_get_main_queue(), ^{ (do something lengthy) [mySpinner stopAnimating]; }); } 

रन लूप पर नियंत्रण लौटाएगा, जो यूपी अपडेटिंग को तैयार करेगा, स्पिनर को शुरू करेगा, फिर प्रेषण कतार से अगली बात मिल जाएगी, जो आपकी वास्तविक प्रसंस्करण है। जब आपका प्रसंस्करण किया जाता है, एनीमेशन रोक बुलाया जाता है, और आप रन लूप पर वापस आ जाते हैं, जहां UI फिर स्टॉप के साथ अपडेट हो जाता है।

एसिंक का मतलब अतुल्यकालिक है और आपको उस समय का उपयोग करना चाहिए। आपको मुख्य थ्रेड पर सिंक्रनाइज़ेशन कभी कॉल नहीं करना चाहिए क्योंकि यह कार्य पूरा होने तक आपके यूआई को लॉक करेगा। स्विफ्ट में ऐसा करने का आप एक बेहतर तरीका है:

 runThisInMainThread { () -> Void in // Run your code like this: self.doStuff() } func runThisInMainThread(block: dispatch_block_t) { dispatch_async(dispatch_get_main_queue(), block) } 

यह मेरे रेपो में एक मानक समारोह के रूप में शामिल है, इसे देखें : https://github.com/goktugyil/EZSwiftExtensions