2011-08-17 18 views
16

मुझे यह कहने के लिए एक सहेजने की ज़रूरत है: "आईओएस, मैं चाहता हूं कि यह विधि a.s..p. को निष्पादित करे, लेकिन इस रन लूप पुनरावृत्ति में नहीं। अगले में जल्द से जल्द, लेकिन कृपया इस में नहीं। धन्यवाद।" धारणा है कि -doSomeOtherThings हमेशा -doSomethingInNextRunLoop से पहले प्रदर्शन किया जाएगा के साथविधि को कैसे कॉल करें as.s.a.p. लेकिन अगले रन लूप पुनरावृत्ति में जल्द से जल्द?

[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0]; 
[self doSomeOtherThings]; 

:

अभी मैं हमेशा इसे इस तरह कर रहा हूँ।

प्रलेखन कहते हैं:

निर्दिष्ट 0 की देरी जरूरी चयनकर्ता तुरंत प्रदर्शन किया जा करने के लिए कारण नहीं है। चयनकर्ता अभी भी थ्रेड के रन लूप पर कतारबद्ध है और जितनी जल्दी हो सके प्रदर्शन किया है।

तो मूल रूप से यह हो सकता है कि विधि तुरंत बुलाया जाता है के रूप में अगर मैं सिर्फ एक सीधा संदेश भेजा था, -doSomethingInNextRunLoop के कारण -doSomeOtherThings से पहले निष्पादित किया जाना है?

मैं पूरी तरह से कैसे सुनिश्चित कर सकता हूं कि इसे as.s.a.p. कहा जाएगा। लेकिन कभी भी इस रन लूप पुनरावृत्ति में कभी नहीं?

शब्द को स्पष्ट करने के लिए: रन लूप के साथ मेरा मतलब मुख्य धागा है, और पुनरावृत्ति जिसमें सभी विधियों को तब तक वापस जाना होगा जब तक कि नए कार्यक्रमों के लिए थ्रेड तैयार न हो जाए।

उत्तर

9

यदि आप चिंतित हैं कि ऐप्पल किसी विशेष मामले में 0 की देरी हो सकती है, तो आप हमेशा 1e-37 की देरी निर्दिष्ट कर सकते हैं। हालांकि performSelector:withObject:afterDelay: के लिए प्रलेखन को आसानी से यह गारंटी देने के लिए पढ़ा जा सकता है कि चयनकर्ता हमेशा अगले रन लूप पुनरावृत्ति के लिए निर्धारित किया जाएगा।

यदि आप चिंतित हैं कि ऐप्पल किसी विशेष मन में कुछ मनमाना निचले बाउंड से कम देरी कर सकता है, तो आप हमेशा NSRunLoop के performSelector:target:argument:order:modes: का उपयोग करने का प्रयास कर सकते हैं, जो विशेष रूप से दस्तावेज रन लूप के अगले पुनरावृत्ति के लिए निष्पादन शेड्यूल करेगा।

+0

शानदार! इसे आसान बनाने के लिए एक श्रेणी समझ में आ जाएगी। – openfrog

0

निश्चित रूप से आप यह करते हैं;

[self doSomeOtherThings]; 
[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0]; 

जो आपके इच्छित निष्पादन आदेश की गारंटी देता है।

+1

यह हमेशा सुविधाजनक (या संभव हो तो) इस तुच्छ उदाहरण के लिए इस्तेमाल किया उदाहरण के तुलना में अधिक जटिल मामलों में है कि ढंग से कोड पुनर्व्यवस्थित करने के लिए नहीं है। – Anomie

+0

वास्तव में नहीं। अगले रन लूप पुनरावृत्ति में चीजों को करने के अच्छे कारण हैं। उनमें से एक: यूआई को बीच में रीफ्रेश करने दें। कथित प्रदर्शन में सुधार। कई अन्य के बीच। इसके अलावा, Anomie सही है। – openfrog

+0

निश्चित रूप से, एनोमी की प्रतिक्रिया सिर पर कील हिट करती है, मैं बस यह इंगित कर रहा हूं कि कुछ मामलों में, कोड-पुनर्संरचना भी समस्या को हल कर सकती है। लेखकों के ब्लॉक की तरह थोड़ा, कभी-कभी देवताओं को किसी समस्या को हल करने पर लटका दिया जाता है जब वास्तव में एक पार्श्व योजना बी होती है। एफडब्ल्यूआईडब्ल्यू मुझे किसी भी उदाहरण से अवगत नहीं है जहां मानक प्रदर्शन चयनकर्ता: ऑब्जेक्ट: बाद में: 0 परिणाम दूसरों द्वारा लिखित यूआई कोड को अनुकूलित करने के लिए अक्सर तकनीक को अवरुद्ध करना और उपयोग करना। – Roger

1

मुझे लगता है कि आप दस्तावेज़ पढ़ने से निष्कर्ष गलत है।

तो मूल रूप से यह हो सकता है कि विधि तुरंत बुलाया जाता है के रूप में अगर मैं सिर्फ एक सीधा संदेश भेजा था

सं प्रलेखन आप बोली का हिस्सा का कहना है कि चयनकर्ता हमेशा पर कतारबद्ध है रन लूप, कोई फर्क नहीं पड़ता कि क्या। तो इसे सीधे संदेश के रूप में निष्पादित नहीं किया जाएगा।

"जरूरी नहीं" के साथ पहला वाक्य थोड़ा भ्रामक हो सकता है, लेकिन मुझे लगता है कि दूसरी वाक्य को वास्तव में स्पष्ट करना चाहिए कि आप जो डरते हैं वह होने वाला नहीं है।

+0

उम्मीद है कि आप सही हैं, क्योंकि मैं शर्त लगाता हूं कि बहुत से लोग अगले पुनरावृत्ति के लिए कतारबद्ध मधुमक्खियों पर निर्भर करते हैं। फिर भी, कुछ अनिश्चितता है। – openfrog

6

काफी तुच्छ GCD (ग्रांड सेंट्रल डिस्पैच) का उपयोग:

dispatch_async (dispatch_get_main_queue(), ^{ 
    NSLog (@"This stuff runs in the next iteration of the main run loop"); 
}); 

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

  • कोई संबंधित समस्या नहीं^_^