2010-02-09 13 views
22

में निर्दिष्ट अवधि की प्रतीक्षा कर रहा है क्या कोको में एक निश्चित मात्रा के लिए प्रतीक्षा करने का एक और अधिक सरल तरीका है जो मैंने नीचे दिया है?कोको

- (void) buttonPressed { 
    [self makeSomeChanges]; 

    // give the user some visual feedback and wait a bit so he can see it 
    [self displayThoseChangesToTheUser]; 
    [self performSelector:@selector(buttonPressedPart2:) withObject:nil afterDelay:0.35]; 
} 

- (void) buttonPressedPart2: (id)unused { 
    [self automaticallyReturnToPreviousView]; 
} 

बस स्पष्ट होना, इस कोड के साथ कोई कार्यात्मक समस्या है - अपने ही गोमांस एक शैलीगत से एक है। मेरे मामले में प्रवाह इतना आसान है कि यह काम करता है, लेकिन इसे सिकुड़ने या कुछ सशर्तों में फेंकने की कोशिश करता है और चीजें बदसूरत हो सकती हैं। यह एक तरह से मुझ पर सता रहा है कि मैं प्रतीक्षा करने के लिए एक तरह से नहीं मिल सका और फिर इस (काल्पनिक) के उदाहरण की तरह कोड में है कि एक ही बिंदु पर लौटने:

- (void) buttonPressed { 
    [self doStuff]; 
    [UIMagicUnicorn waitForDuration:0.35]; 
    [self doStuffAfterWaiting]; 
} 

उत्तर

61

वहाँ

usleep(1000000); 

और

[NSThread sleepForTimeInterval:1.0f]; 

जो दोनों के सो जाएगा 1 सेकंड के लिए।

+8

और जो दोनों के कुछ और करने से धागा रोकेंगे। बुरा, अगर यह मुख्य यू.आई. में है धागा। – pestilence669

+3

सच है। यदि आपको इस अवधि के दौरान उत्तरदायी होने के लिए यूआई की आवश्यकता है, तो सवाल में सुझाए गए दृष्टिकोण, एक एनएसटीमर एक बार फायरिंग (जैसा कि आप सुझाव देते हैं), या इस देरी को करने वाला पृष्ठभूमि धागा बेहतर होगा। –

+0

धन्यवाद - यही वह है जो मैं सोच रहा था, शायद उस पर ठोकर खाई होगी 'नींद' 'प्रतीक्षा' के लिए कई समानार्थी शब्दों में से एक था जिसे मैंने खोजना सोचा था। इनका उपयोग करने के लिए * नहीं * के बारे में चेतावनी के लिए भी महामारी। –

2

आप शायद एक NSTimer उपयोग करना चाहते हैं और यह है अपने कॉलबैक के रूप में "doStuffAfterWaiting" संदेश भेजें। किसी भी तरह की "नींद" धागे को तब तक अवरुद्ध कर देगी जब तक वह जागता न जाए। अगर यह आपके यू.आई. में है धागा, यह आपके ऐप को "मृत" दिखाई देगा। यहां तक ​​कि यदि यह मामला नहीं है, तो यह खराब रूप है। कॉलबैक दृष्टिकोण आपके निर्दिष्ट समय अंतराल तक पहुंचने तक CPU को अन्य कार्यों को करने के लिए मुक्त कर देगा।

यह doc उपयोग उदाहरण हैं और & पर अपना टाइमर बनाने के तरीके पर अंतरों पर चर्चा करता है।

बेशक, प्रदर्शन चयनकर्ता: बाद में: वही काम करता है।

3

मुझे यकीन नहीं है कि यह मौजूद है (अभी तक), लेकिन 10.6 (या PLBlocks 10.5 और आईफोन पर) में ब्लॉक के साथ यह performBlock:afterDelay: जैसे छोटे रैपर को लिखना बहुत आसान होना चाहिए जो वास्तव में आप बिना चाहते हैं पूरे धागे को सोने की जरूरत है। वास्तव में कोड का एक उपयोगी छोटा टुकड़ा होगा।

माइक ऐश written about an approach like this on his blog है:

NSString *something = ...; 
RunAfterDelay(0, ^{ 
    NSLog(@"%@", something); 
    [self doWorkWithSomething: something]; 
}); 
2

क्या एक सरल usleep साथ गलत क्या है? मेरा मतलब है, "कोको शुद्धता" के अलावा, यह अभी भी अन्य समाधानों की तुलना में बहुत छोटा है :)

+2

यह धागा को ब्लॉक करता है। यदि इसे मुख्य रूप से बुलाया जाता है, तो आप प्रभावी रूप से रन लूप को मार रहे हैं और ऐप "मृत" – pestilence669

+3

दिखाई देगा, फिर मुख्य – Charlie

10

यहां ऐसा करने का एनएसटीमर तरीका है। यह आपके द्वारा उपयोग की जा रही विधि से भी अधिक कठिन हो सकता है, लेकिन यह दोहराने की घटनाओं को अनुमति देता है, इसलिए मैं इसे पसंद करता हूं।

[NSTimer scheduledTimerWithTimeInterval:0.5f 
           target:self 
           selector: @selector(doSomething:) 
           userInfo:nil 
           repeats:NO]; 

आप usleep की तरह कुछ() जो सिर्फ़ अपने ऐप्लिकेशन को फांसी और यह अनुत्तरदायी महसूस करते हैं बचना चाहते हैं।

+1

से कॉल न करें, मुझे लगता है कि आपका मतलब 'NSTimer' है, न कि' NSThread'। –

+7

"आप कुछ नींद() से बचना चाहते हैं जो आपके ऐप को लटकाएगा और इसे उत्तरदायी महसूस करेगा।" "निश्चित रूप से यह सच है यदि आपने मुख्य धागे से 'usleep'' कहा है। – chown

0

आप एक अतुल्यकालिक समाधान कोई आपत्ति नहीं है, ये रहा:

[[NSOperationQueue currentQueue] addOperationWithBlock:^{ 
    [self doStuffAfterWaiting]; 
}];