2011-08-03 15 views
41

अगर मैं एक धारावाहिक कतार है, मैं कैसे, मुख्य थ्रेड से, यह बताने के तुरंत निष्पादन बंद करो और अपने कार्यों के सभी रद्द करने के लिए कर सकते हैं?प्रेषण कतार में कार्यों के निष्पादन को कैसे रोकें?

उत्तर

3

मुझे यकीन नहीं है कि आप निष्पादित एक मौजूदा ब्लॉक को रोक सकते हैं, लेकिन आप कतार को किसी भी नई कतार वस्तुओं को निष्पादित करने से रोकने के लिए dispatch_suspend को कॉल कर सकते हैं। फिर आप निष्पादन को पुनरारंभ करने के लिए dispatch_resume को कॉल कर सकते हैं (लेकिन ऐसा लगता है कि आप ऐसा नहीं करना चाहते हैं)।

http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

2

cancelAllOperations NSOperationQueue पर देखें। यह सुनिश्चित करने के लिए अभी भी आप पर निर्भर है कि आपके ऑपरेशन रद्द संदेश को सही तरीके से संभाल लें।

12

यह एक बहुत आम सवाल है, और एक मेरे द्वारा उत्तरित से पहले:

Suspending GCD query problem

संक्षिप्त उत्तर है कि GCD एक रद्द एपीआई नहीं है; आपको अपने रद्दीकरण कोड को स्वयं लागू करना होगा। मेरे उत्तर में, ऊपर, मैं मूल रूप से दिखाता हूं कि यह कैसे किया जा सकता है।

0

एक अन्य समाधान पुराने कतार फेंक और एक नया बनाने के लिए है। इससे मेरा काम बनता है। यह एक सरणी को हटाना है, आप उस पर हर तत्व को हटा सकते हैं या आप पुराने को बदलने के लिए बस एक नया बना सकते हैं।

+0

लेकिन आप उस कैसे करते हो ?? – Fattie

+1

मुझे नहीं पता कि आप यह कैसे करते हैं, लेकिन मुझे नहीं लगता कि यह काम करेगा। आपको कतार जारी करनी है, लेकिन कतार पर प्रत्येक ब्लॉक इसके संदर्भ को बरकरार रखता है, इसलिए जब तक सभी ब्लॉक पूर्ण नहीं होते हैं, तब तक इसे स्मृति से साफ़ नहीं किया जाएगा। tl; डॉ यह भारी स्मृति रिसाव का कारण बन जाएगा। – phreakhead

10

iOS के 9/ओएस एक्स 10.11 के रूप में गैर तुच्छ खुद के तर्क को लागू करने के बिना एक प्रेषण कतार से लंबित कार्य खाली करने के लिए कोई रास्ता नहीं है।

आप एक प्रेषण कतार रद्द करने के लिए एक की जरूरत है, तो आप NSOperationQueue जो इस और अधिक प्रदान करता है का उपयोग कर से बेहतर हो सकता है। उदाहरण के लिए, यहाँ आप कैसे एक कतार "अभी नहीं" है:

9

आप SwiftDispatchWorkItem वर्ग का उपयोग कर रहे हैं तो भी काम करता है इकाइयों को व्यक्तिगत रूप से रद्द कर दिया।

कार्य आइटम आप काम की व्यक्तिगत इकाइयों सीधे के गुणों को कॉन्फ़िगर करने के लिए अनुमति देते हैं। वे आपको पूरा होने की प्रतीक्षा करने, उनके पूरा होने के बारे में अधिसूचित होने और/या उन्हें रद्द करने के प्रयोजनों के लिए अलग-अलग कार्य इकाइयों को संबोधित करने की अनुमति भी देते हैं। (आईओएस 8.0+ मैकोज़ 10.10+ में उपयोग के लिए उपलब्ध)।

DispatchWorkItem निष्पादित किया जा सकता है जो काम किया जा सकता है। एक कार्य आइटम डिस्पैच्यूयूयू और डिस्पैच समूह में प्रेषित किया जा सकता है। एक DispatchWorkItem भी एक DispatchSource घटना, पंजीकरण के रूप में स्थापित किया जा सकता है, या हैंडलर रद्द कर दें।

https://developer.apple.com/reference/dispatch/dispatchworkitem

+1

तीर का उपयोग करने के लिए अच्छा विचार :) – Vyacheslav

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