2015-01-22 12 views
24

क्या प्रेषण रद्द करने का कोई तरीका है() भविष्य में कुछ समय के लिए निर्धारित है, और अब तक नहीं निकाल दिया गया है? मैं सर्वर से अपडेट के लिए शेड्यूलर की तरह कुछ करने की कोशिश कर रहा हूं, और यह विधि ठीक है जैसा मैं चाहता हूं, लेकिन, मुझे कुछ बिंदु पर रद्द करना और फिर से शेड्यूल करना अच्छा लगेगा। क्या यह संभव है या मुझे फॉलबैक करना होगा और एनएसटीमर का उपयोग करना होगा?dispatch_after() विधि रद्द करें?

+0

yup। ऐसा लगता है कि हमारे पास डुप्लीकेट हैं। आश्चर्य है कि क्या इस प्रश्न को मर्ज करना संभव है? –

उत्तर

1

प्रेषण टाइमर स्रोत का उपयोग करें (जो dispatch_after किसी भी तरह आंतरिक रूप से उपयोग करता है)।

एक प्रेषण टाइमर स्रोत रद्द किया जा सकता है या इसके टाइमर पैरामीटर सृजन के बाद बदल गए हैं।

19

प्रेषण से इसे हटाने के बाद प्रेषण से रोकने का कोई तरीका नहीं है, जिसका अर्थ यह है कि आपका प्रेषण_ रद्द नहीं किया जा सकता है। केवल एक विकल्प है कि आपके ब्लॉक में निष्पादन को रोकने के लिए रनटाइम पर एक शर्त को चेक किया जाए। यानी।

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(),^{ 
if(self.shouldExecuteDispatchBlock) 
{ // do your stuff } }); 
+0

हम्म इसलिए इस ब्लॉक के निष्पादन के लिए अगली बार आता है (और इसे रद्द करने के लिए सेट किया गया है), मुझे लगता है कि यह तब तक सभी मेमोरी/ऑब्जेक्ट्स को हॉग करेगा। शायद एक समस्या अगर आपके चक्र 60 मिनट की तरह हैं? :-) – Jonny

+0

हां और नहीं। ब्लॉक मेमोरी की प्रतिलिपि बनाता है, जिसका अर्थ यह है कि यदि आप अपने ब्लॉक में एक इंट वैल्यू पर आते हैं, तो इसकी प्रतिलिपि बनाई जाएगी और जब तक ब्लॉक लाइव रहता है तब तक डुप्लीकेट के रूप में स्मृति में रहेगा। लेकिन वस्तु के लिए, यह उन्हें डुप्लिकेट नहीं करता है, यह एड्रेस की प्रतिलिपि बनाता है। यदि आप किसी छवि को रेफर करते हैं, तो आपके पास ढेर में एक UIImage ऑब्जेक्ट होगा, लेकिन ब्लॉक केवल पॉइंटर वैल्यू (आर्क 64 में 8 बाइट्स) बनाए रखेगा, इसलिए कोई बड़ी बात नहीं है। निश्चित रूप से जब तक ब्लॉक बाहर नहीं जाता है तब भी छवि स्मृति में बरकरार रहेगी, इसलिए यह चाप द्वारा साफ नहीं किया जाएगा। –

+0

मैंने इसे डिस्पैच्यूयूयू के विस्तार में बदल दिया है: https://github.com/nrbrook/DispatchAfterCancellable – Nick

11

ठीक है, हां, तो एकत्र सभी प्रश्नों के उत्तर, और संभावित समाधानों के साथ, इस मामले (संरक्षण सादगी) performSelector:withObject:afterDelay: बुला और cancelPreviousPerformRequestsWithTarget: कॉल के साथ इसे रद्द करने से जब वांछित है के लिए सबसे अच्छा लगता है। - मेरे मामले में बस अगले देरी कॉल का समय निर्धारण से पहले: क्या में है के निष्पादन को रद्द करने के

https://github.com/SebastienThiebaud/dispatch_cancelable_block

आप एक रद्द कॉल कर सकते हैं() फ़ंक्शन:

[NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(myDelayedMethod) object: self]; 

[self performSelector:@selector(myDelayedMethod) withObject: self afterDelay: desiredDelay]; 
+0

मैंने इस पथ को शुरू किया, लेकिन क्लास विधियों के साथ कोई ऐसा कैसे करता है (यही कारण है कि मैंने 'dispatch_after' पर स्विच किया)? – Olie

+0

@ ओली अच्छा एक। फिर आपको उन कॉलों को उदाहरण में लपेटना होगा, या प्रेषण + ध्वज का उपयोग करना होगा (अनुमान है, दूसरा आसान होगा) –

6

इस प्रयोजन के लिए मैं इस वर्ग के लिए प्रयोग किया जाता खंड।

+3

यदि आप इसे स्विफ्ट में उपयोग करेंगे - तो आप इसे यहां देख सकते हैं https://github.com/katleta3000/CancelBlocks/ – katleta3000

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