डिजाइन करके, dispatch_*()
एपीआई रद्द करने की कोई धारणा है। इसका कारण यह है कि यह लगभग सार्वभौमिक रूप से सच है कि आपका कोड कब रोकना है या नहीं, और इस प्रकार, प्रेषण _ *() एपीआई में भी समर्थन करने की अवधारणा को अनावश्यक कर देगा (और, अनावश्यकता त्रुटियों के साथ)।
इस प्रकार, यदि आप "प्रारंभिक रोकना" चाहते हैं या अन्यथा प्रेषण कतार में लंबित आइटम को रद्द करना चाहते हैं (भले ही उन्हें कैसे लगाया गया हो), तो आप कुछ राज्यों को संलग्न ब्लॉक के साथ साझा करके ऐसा करते हैं जो आपको अनुमति देता है रद्द करना।
if (is_canceled()) return;
या:
__block BOOL keepGoing = YES;
dispatch_*(someQueue, ^{
if (!keepGoing) return;
if (weAreDoneNow) keepGoing = NO;
}
ध्यान दें कि दोनों enumerateObjectsUsingBlock:
और enumerateObjectsWithOptions:usingBlock:
दोनों समर्थन रद्द क्योंकि कि एपीआई एक अलग भूमिका में है। गणना विधि के लिए कॉल तुल्यकालिक है, भले ही गणना करने वाले ब्लॉक का वास्तविक निष्पादन विकल्प के आधार पर पूरी तरह से समवर्ती हो।
इस प्रकार, *stopFlag=YES
की स्थापना को रोकने के लिए गणन बताता है। हालांकि, यह गारंटी नहीं देता है कि यह समवर्ती मामले में तुरंत बंद हो जाएगा। वास्तव में, गणना रोकने से पहले कुछ और पहले से ही अवरुद्ध ब्लॉक निष्पादित कर सकते हैं।
(कोई शायद संक्षेप में सोच सकता है कि BOOL
को यह संकेत देने के लिए अधिक उचित होगा कि गणना जारी रहनी चाहिए या नहीं। ऐसा करने के लिए समेकित मामले में समेकित ब्लॉक को समकालिक रूप से निष्पादित किया जाना चाहिए, ताकि वापसी मूल्य जांच की जा सकती है। यह बहुत कम कुशल होता।)
अच्छा, यह पूरी तरह से सच नहीं है; जबकि यह सच है कि enumerateObjectsUsingBlock: अनुक्रमिक है, वहाँ भी enumerateObjectsWithOptions है: का उपयोग कर ब्लॉक:। यह "विकल्प" पैरामीटर का उपयोग यह निर्देशित करने के लिए किया जा सकता है कि गणना समवर्ती रूप से होनी चाहिए। मुझे यकीन नहीं है कि वे आंतरिक रूप से ऐसा कैसे कर रहे हैं, लेकिन मुझे लगता है कि यह एक प्रेषण_ग्रुप का उपयोग करके किया गया है जो अधिक प्रत्यक्ष नियंत्रण की अनुमति देगा। –
लेकिन बिंदु यह है कि enumerateObjectsWithOptions: useBlock: अभी भी * स्टॉप पैरामीटर है। –
dispatch_apply() में रोकने का समर्थन करने के लिए यह तार्किक होगा, लेकिन यह डिजाइन लक्ष्यों के भीतर समझ में नहीं आया। यह बताते हुए कि 'enumerateObjectsUsingBlock पर स्टॉप फ्लैग:' अंतर्निहित अनुक्रमिक निष्पादन की वजह से मौजूद है; दोनों पूरी तरह से ऑर्थोगोनल हैं। – bbum