2009-11-21 18 views
27

मेरे पास कोड का एक ब्लॉक है जिसे अक्सर मुख्य धागे या कई अन्य पृष्ठभूमि धागे से एक्सेस किया जाता है। मुझे यह सुनिश्चित करने की ज़रूरत है कि यह कोड केवल एक समय में संसाधित हो जाए।@ सिंक्रनाइज़() और एनएसएलॉक मतभेद

मैं वर्तमान में @synchronized(self) { } ब्लॉक का उपयोग कर रहा हूं लेकिन मुझे यकीन नहीं है कि यह सही सुरक्षा प्रदान कर रहा है या नहीं। NSLock उदाहरण से यह अलग कैसे है?

अंत में, क्या कोई सुझाव दे सकता है कि मैं अपनी विधि की रक्षा कैसे कर सकता हूं?

माइक

उत्तर

30

[[[UIApplication sharedApplication] delegate] myMethod]; 

बहुत धन्यवाद, गूगल मैक के बारे में ब्लॉग पर एक महान ब्लॉग पोस्ट है: विधि अपने आवेदन प्रतिनिधि में है, और मैं फोन करके विभिन्न धागे से उस तक पहुंच @synchronized की अंदरूनी कामकाज:
http://googlemac.blogspot.com/2006/10/synchronized-swimming.html

मैं वर्तमान में एक @synchro उपयोग कर रहा हूँ nized (self) {} ब्लॉक लेकिन मैं सुनिश्चित नहीं हूं कि यह सही सुरक्षा प्रदान कर रहा है या नहीं। एनएसएलॉक इंस्टेंस से अलग-अलग कैसे होता है?

महत्वपूर्ण वर्गों को सिंक्रनाइज़ करने के कई तरीके हैं (@synchronized, NSLock, OSSpinLock, ...)।
मुझे लगता है कि @synchronized सबसे सुविधाजनक (and also the slowest) दृष्टिकोण है।
Here is a good SO answer जो @ सिंक्रनाइज़ और एनएसएलॉक के बीच अंतर बताता है।

आप साझा किए गए उदाहरणों (जो मूल रूप से एक सिंगलटन) प्रतिनिधि पर आपकी विधि तक पहुंच रहे हैं। हो सकता है कि आप अपने डिज़ाइन पर पुनर्विचार कर सकें और इस तरह से पता लगा सकें जो आपको myMethod के भीतर कोड का एक छोटा टुकड़ा लॉक करने की अनुमति देता है।

+0

आपकी मदद के लिए धन्यवाद! क्या हमेशा 'स्वयं' का उपयोग करना सही है? इस मामले में स्वयं आवेदन प्रतिनिधि को इंगित करेगा, इससे कोई फर्क नहीं पड़ता कि यह क्या कह रहा है? मैं उलझन में हूं कि आपको इसमें कुछ क्यों पारित करना है! –

+2

यदि आप "प्रति वर्ग" लॉक करना चाहते हैं तो आप "प्रति उदाहरण" और [YourClass क्लास] लॉक करना चाहते हैं (स्वयं) का उपयोग करें (स्वयं)। (स्वयं) का अर्थ है कि महत्वपूर्ण खंड के निष्पादन को वर्तमान (विशेष) ऑब्जेक्ट के लिए सिंक्रनाइज़ करने की आवश्यकता है। –

+0

अहह, मुझे मिल गया! बहुत बहुत धन्यवाद :-) –

16

आप वास्तव में कुछ आप एक समय में एक आइटम संसाधित करने के लिए चाहता हूँ कि क्या ज़रूरत है, तो मेरी सिफारिश NSOperations उपयोग करने के लिए है और एक NSOperationQueue जहां 1. maxConcurrentOperationCount निर्धारित किया है आप सुनिश्चित करें कि एक ही रास्ता है कि कोड के इस साझा ब्लॉक को इस कतार में संचालन के माध्यम से एक्सेस किया जाता है, आप महंगी ताले की आवश्यकता को दूर कर देंगे।

इसके लिए आपके आवेदन के थोड़ा पुनर्गठन की आवश्यकता हो सकती है, लेकिन मुझे पता चला है कि इसे अपने स्वयं के अनुप्रयोगों में लागू करने से बेहतर प्रदर्शन और क्लीनर कोड बढ़ गया है।

+0

+1, हालांकि किसी को यह महसूस करना चाहिए कि 'थोड़ा पुनर्गठन' आपके कोड को प्रकृति में पूरी तरह से असीमित होने की आवश्यकता होगी। @ सिंक्रनाइज़ेशन एक सिंक्रोनस अवरुद्ध लॉक होने के लिए है, जबकि एक कतार का उपयोग करने का मतलब होगा कि कॉलिंग साइट को लौटाए गए मूल्य की अपेक्षा नहीं करनी चाहिए बल्कि इसके परिणामस्वरूप प्रसंस्करण परिणामों के लिए ब्लॉक कॉलबैक का उपयोग करना चाहिए। यह आपके कोड के महत्वपूर्ण वर्गों में आदर्श नहीं हो सकता है जहां कॉलिंग कॉल की उम्मीद है। – strangetimes

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