2016-10-04 30 views
12

एक पंक्ति का चयन करते समय निम्न कोड AVAudioPlayer एस के सेट को एक निश्चित तिथि पर प्लेबैक के लिए सेट करता है (इस मामले में, 50 खिलाड़ी 1 सेकंड के अंतराल में खेल रहे हैं) में कई AVAudioPlayers को playAtTime() के साथ सेट करना बंद करें।)। चूंकि मैं फिर से स्पर्श करते समय पूरी प्रक्रिया को पुनरारंभ करना चाहता हूं, इसलिए मुझे लूप के लिए सेटअप को तोड़ने की आवश्यकता है क्योंकि खिलाड़ियों को सेटअप करने में कुछ सेकंड लगते हैं।लूप

इसके अलावा, AVAudioPlayerDelegate की प्रतिनिधि विधि का उपयोग करके प्लेबैक को समाप्त करने के बाद प्रत्येक खिलाड़ी को हटाया जा रहा है। मैंने कोड में इसे शामिल नहीं किया क्योंकि यह प्रश्न के लिए प्रासंगिक नहीं है।

मैं जाँच करने के लिए पाश के लिए सेटअप की अनुमति है या अंदर एक ध्वज का उपयोग कर की कोशिश की है, लेकिन वह काम नहीं करता।

var players: [AVAudioPlayer] = [] 
var loadError: NSError? 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    // Removes the players that have been setup already. 
    players.removeAll() 

    // The for loop from the previous row selection should be stopped here. 
    for i in 0..<50 { 
    do { 
     let player = try AVAudioPlayer(contentsOfURL: soundUrls[i]) 
     players += [player] 

     // The process of setting these up takes a few seconds, I need to break it. 
     print("Firing timer") 
     player.playAtTime(player.deviceCurrentTime + NSTimeInterval(i)) 

    } catch let error as NSError { 
     loadError = error 
    } 
    } 
} 

क्या होता है, यह है कि सेटअप पिछली पंक्ति चयन से शुरू हो रहा है जब तक यह समाप्त हो गया है और उसके बाद ही पाश शुरू होता है के लिए नए जारी रहेगा। मुझे इसे पहले तोड़ना होगा।

मैं समझ नहीं है कि यह कैसे से निपटने के लिए। शायद मुख्य धागे (कैसे?) से प्रक्रियाओं को हटाकर? किसी भी मदद की बहुत सराहना की!

+0

अपने पाश दुर्घटना होगा अगर soundUrls 50 है 0 से आइटम ... 50 रन 51 बार। – ergoon

+0

सुधार के लिए धन्यवाद, टेक्स्ट फ़ील्ड में यह उदाहरण कोड बनाते समय यह मेरी गलती थी, मैंने इसे सही कर दिया है। अभी भी एक जवाब की तलाश में! – nontomatic

उत्तर

1

मैं थोड़ा समस्या के अपने बयान के बारे में उलझन हूँ, लेकिन मैं वैसे भी एक सुझाव देने के लिए कोशिश करेंगे। आप कहते हैं कि आप पंक्ति का चयन करते समय खिलाड़ियों को सेट अप करते हैं, लेकिन उन्हें सेट करने के लिए कोड cellForRowAtIndexPath में है। तो यह स्थापित हो गया है और जब एक सेल वापस आ जाता है और आपके टेबल व्यू में प्रदर्शित होता है तो खेलना शुरू होता है।

आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं? आपके पास कई पंक्तियों के साथ एक टेबल व्यू है, और जब भी आप किसी सेल पर टैप करते हैं तो पचास आवाज़ें एक दूसरे के बाद एक (1 सेकंड अलग) खेलना शुरू कर देती हैं। यदि आप एक ही सेल को फिर से टैप करते हैं तो उन्हें रोकना और पुनरारंभ करना चाहिए, है ना?

तो मैं क्या अपनी TableViewController की viewDidLoad में 50 खिलाड़ियों की स्थापना की है। ReadyToplay() का उपयोग करें। आवश्यकता होने पर उन्हें प्रारंभ करें।

तो फिर तुम उन्हें, जाँच अगर वे अब भी isPlaying का उपयोग कर खेल रहे हैं, उन के माध्यम से सिर्फ चक्र को पुनः आरंभ करने की आवश्यकता है। यदि आवश्यक हो तो उन्हें रोकें, वर्तमान समय को 0 पर सेट करें और playAtTime को दोबारा कॉल करें। ऑडियोडिडफिनिश प्लेइंग में खिलाड़ियों को न हटाएं। क्योंकि तब आपको उन्हें फिर से बनाना होगा। बस उन्हें रीसेट करें ताकि वे तत्काल प्लेबैक के लिए फिर से उपलब्ध हों।

वैसे, आप ऑडियो के साथ और अधिक करते हैं और अधिक नियंत्रण और बेहतर प्रदर्शन मैं अत्यधिक उत्कृष्ट व्यवस्थाएं की सिफारिश चाहते हैं जा रहे हैं तो कमाल ऑडियो इंजन 2, या AudioKit

+0

उत्तर के लिए धन्यवाद, FilipD। मैं आपके द्वारा वर्णित खिलाड़ियों को सेट नहीं कर सकता (इस तरह मैंने इसे मूल रूप से आजमाया था) क्योंकि मुझे समय में सर्वोत्तम सटीकता रखने के लिए playAtTime विधि का उपयोग करने की आवश्यकता है। वास्तव में, एक ही समय में कई आवाज़ें चल रही होंगी। मैंने समस्या के बारे में स्पष्ट होने के लिए उदाहरण को तोड़ दिया है। मैं playAtTime के साथ उन्हें सेट करते समय एक ही खिलाड़ी को कई बार उपयोग नहीं कर सकता (जब ध्वनि दोहराई जानी चाहिए) क्योंकि खिलाड़ी को अगले playAtTime विधि से ओवरराइड किया जाएगा। ... – nontomatic

+0

तो, एकमात्र तरीका प्रत्येक खिलाड़ी को एक ध्वनि कार्यक्रम के लिए शुरू करना है, भले ही कई खिलाड़ी अंततः एक ही ध्वनि फ़ाइल को वापस चलाएं। कोड उदाहरण में लिखे गए खिलाड़ियों को सेट करने में कुछ सेकंड लगेंगे क्योंकि गणनाएं की जाती हैं।इस समय के दौरान खिलाड़ियों के लिए सेटअप समाप्त होने तक हर दूसरी प्रक्रिया (जैसे उपयोगकर्ता फिर से एक पंक्ति को छूने) में देरी होगी। मैं प्रत्येक खिलाड़ी के लिए कंसोल चलाने वाले प्रिंट स्टेटमेंट देख सकता हूं। केवल एक बार ऐसा करने के बाद नया सेटअप शुरू हो जाएगा। ... – nontomatic

+0

जब उपयोगकर्ता प्लेबैक के लिए एक नया सेटअप मांग रहा है तो मुझे इस प्रक्रिया को तोड़ने की जरूरत है। सेटअप किए गए सभी खिलाड़ियों को हटा दिया जाना चाहिए (यह एक आसान हिस्सा है), लेकिन अन्य सभी जो स्थापित किए जा रहे हैं, को भी हटाया जाना चाहिए, तुरंत (जो समस्या है)। चूंकि यह प्रक्रिया मुख्य धागे में होती है, मैंने सोचा, शायद वहां इन प्रक्रियाओं की पहचान करने और उन्हें कतार से हटाने का एक तरीका है। मैं ऐसा करने का प्रबंधन नहीं करता हूं। ... – nontomatic