2010-11-16 17 views
7

मेरे पास एक ऑडियो फ़ाइल है जिसे उपयोगकर्ता को UIScrollView स्क्रॉल करते समय फीका होना चाहिए। हालांकि, उपयोगकर्ता द्वारा स्क्रॉलिंग बंद होने तक performSelector:withObject:afterDelay: विधि अवरुद्ध है। तो मैं एक और धागा पर एक fadeout प्रदर्शन करने के लिए कुछ कोड बनाने के लिए प्रयास किया है:मैं पृष्ठभूमि थ्रेड पर AVAudioPlayer को कैसे निकाल सकता हूं?

- (void)fadeOut 
{ 
    [NSThread detachNewThreadSelector:@selector(fadeOutInBackground:) toTarget:self withObject:self.audioPlayer]; 
} 

- (void)fadeOutInBackground:(AVAudioPlayer *)aPlayer 
{ 
    NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init]; 
    [self performSelector:@selector(fadeVolumeDown:) withObject:aPlayer afterDelay:0.1]; 
    [myPool release]; 
} 

- (void)fadeVolumeDown:(AVAudioPlayer *)aPlayer 
{ 
    aPlayer.volume = aPlayer.volume - 0.1; 
    if (aPlayer.volume < 0.1) { 
     [aPlayer stop];   
    } else { 
     [self performSelector:@selector(fadeVolumeDown:) withObject:aPlayer afterDelay:0.1]; 
    } 
} 

यह जहाँ तक performSelector के रूप में हो जाता है, लेकिन आगे नहीं क्योंकि मुझे लगता है कि यह एक धागा यह करने के लिए पहुँच नहीं है पर प्रदर्शन करने के लिए कोशिश कर रहा है। मैं इसे performSelector:onThread:withObject:waitUntilDone: के लिए भी बदल नहीं सकता क्योंकि इसमें कोई देरी विकल्प नहीं है।

कोई भी विचार? उन्होंने ध्वनि को खत्म करने के लिए इतना कठिन क्यों बनाया है? moan

धन्यवाद!

उत्तर

14

मैंने चयनकर्ता को डिफ़ॉल्ट रूप से एक अलग रन लूप मोड में शेड्यूल करके एक समान समस्या का समाधान किया। इस तरह यह स्क्रॉलिंग घटनाओं में हस्तक्षेप नहीं कर रहा है। का उपयोग करते हुए NSRunLoopCommonModes मेरे लिए काम किया:

[self performSelector:@selector(fadeVolumeDown:) 
      withObject:aPlayer 
      afterDelay:0.1 
       inModes:[NSArray arrayWithObject: NSRunLoopCommonModes]]; 
+2

निरपेक्ष प्रतिभा। धन्यवाद! :) – jowie

+0

दिव्य! धन्यवाद @ मार्टिनकोट! –

0

जवाब से प्रेरित होकर ऊपर

while (theAudio.volume > 0.000000) 
     [self fadeVolumeDown]; 

- (void) fadeVolumeDown{ 
    theAudio.volume -=0.01; 
} 
संबंधित मुद्दे