सबसे NSOperationQueue
hackery के साथ, आप आपरेशनों के बीच निर्भरता के लिए अपने समर्थन दोहन कर सकते हैं:
- एक
NSBlockOperation
उपवर्ग बनाएँ, ReaderWriterBlockOperation
। इसमें जोड़ें BOOL writer
।
- प्रति संरक्षित संसाधन प्रति ऑपरेशन कतार बनाएं।
- ग्राहकों को अपने ऑपरेशन कतार को उजागर करना बंद करें। इसके बजाय एपीआई
-readWithBlock:
और -writeWithBlock:
का पर्दाफाश करें। दोनों ReaderWriterBlockOperation
को एनक्यू करें, writer == NO
वाला दूसरा, अन्य == YES
। उनका ऑपरेशन निम्नानुसार निर्भरता प्रबंधित करता है:
-readWithBlock:
@synchronized(self)
ब्लॉक में, पिछले लेखक से पहले लेखक ब्लॉक की तलाश में संचालन का एक स्कैन करता है। यदि कोई नहीं मिला है, तो यह संचालन और रिटर्न जोड़ता है। यदि कोई पाया जाता है, तो यह नया पाठक ब्लॉक लेखक पर निर्भर करता है, इसे संलग्न करता है, और रिटर्न देता है।
-writeWithBlock:
वही काम करता है। सिवाय इसके कि कतारबद्ध परिचालन में कोई लेखक नहीं मिला है, यह ब्लॉक को सभी पाठकों पर निर्भर करता है। यदि कोई कतारबद्ध परिचालनों में पाया जाता है, तो यह स्वयं उस ऑपरेशन और सभी निम्नलिखित (पाठक) संचालन पर निर्भर करता है।
इससे उन्हें पूरा कर लिया है से पहले लेखक जब तक सभी पाठकों को अवरुद्ध, और पाठकों तक सभी लेखकों को अवरुद्ध उन्हें पूर्ण कर लेने से पहले का परिणाम होना चाहिए।
एक संभावित मुद्दा: मैं अस्पष्ट हूं (क्योंकि दस्तावेज़ अस्पष्ट हैं, और मैंने इसे अभी तक लागू नहीं किया है) यदि NSBlockOperation
वास्तव में अपने ब्लॉक को पूरा होने से पहले दौड़ने के लिए प्रतीक्षा करता है। यदि ऐसा नहीं होता है, तो आपको अपने आप को अपने ऑपरेशन सबक्लास में प्रबंधित करना होगा।
सभी ने कहा कि, यदि सिस्टम एक कार्य समाधान प्रदान करता है, जैसे अवरोध ब्लॉक, तो आपको इसका उपयोग करना चाहिए। यह पूरी प्रणाली एक हैक करने के लिए एक हैक है जो कुछ ऐसा करने के लिए कतार भेजती है जो कतारों को बहुत अच्छी तरह से संभालने के लिए ट्यून किया गया है। यदि प्रदर्शन वास्तव में कोई चिंता नहीं है, तो क्यों न केवल एक धारावाहिक कतार (NSOperationQueue
अधिकतम समवर्ती ऑपरेशन गिनती == 1) का उपयोग करें?
स्रोत
2015-05-22 15:24:19
अच्छा सवाल। कुछ समाधानों में रुचि रखते हैं ... –
सेमफोर के साथ क्या गलत है? – MattD
ऑपरेशन कतार के अंतर्निहित पर एक जीसीडी बाधा का उपयोग करना्यूयूयू डिस्पैच_क्यू धोखाधड़ी है? – stevesliva