2016-10-04 3 views
12

행을 선택하면 다음 코드는 특정 날짜 (이 경우 1 초 간격으로 재생되는 50 명의 플레이어)에서 재생할 AVAudioPlayer 집합을 설정합니다). 다시 터치 할 때 전체 프로세스가 다시 시작되기를 원하기 때문에 for 루프에서 설정을 중단해야합니다. 플레이어를 설정하는 데 몇 초가 걸리기 때문입니다.for 루프에서 playAtTime()을 사용하여 여러 AVAudioPlayers 설정 중지

이외에도 각 플레이어는 audioDidFinishPlaying 대리자 방법 AVAudioPlayerDelegate을 사용하여 재생을 마친 후에 제거됩니다. 질문과 관련이 없으므로 코드에이 내용을 포함시키지 않았습니다.

for 루프에서 플래그를 사용하여 설정을 허용했는지 확인했지만 작동하지 않습니다.

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 
    } 
    } 
} 

이전 행 선택에 의해 트리거 된 설정은 완료 될 때까지 계속 진행되고 새로운 for 루프가 시작될 때까지 계속됩니다. 이전에 해독해야합니다.

어떻게 해결할 수 있는지 알 수 없습니다. 어쩌면 주 스레드에서 프로세스를 제거하여 (어떻게?)? 도움이 많이 감사!

+0

루프가 중단됩니다려고하는 경우에 그런데

는 soundUrls (50)이있는 경우 0 ... 50의 항목이 51 번 실행됩니다. – ergoon

+0

수정 해 주셔서 고맙습니다. 텍스트 필드에서이 예제 코드를 만들 때 수정 한 것입니다. 수정했습니다. 아직도 대답을 찾고 있습니다! – nontomatic

답변

1

문제에 대한 귀하의 진술에 대해 다소 혼란 스럽지만 어쨌든 제안을하려고합니다. 행을 선택할 때 플레이어를 설정한다고 설정했지만 코드를 설정하는 코드는 cellForRowAtIndexPath에 있습니다. 따라서 셀이 반환되어 테이블보기에 표시되면 설정되고 재생됩니다.

달성하려는 목표는 무엇입니까? 여러 개의 행이있는 테이블 뷰가 있으며 셀을 탭할 때마다 50 개의 사운드가 차례로 재생되기 시작해야합니다 (1 초 간격). 같은 셀을 다시 탭하면 다시 시작하고 다시 시작해야합니다.

그럼 내가하는 것은 50 명의 플레이어를 TableViewController의 viewDidLoad에 설정하는 것입니다. prepareToPlay()를 사용하십시오. 필요한 경우 시작하십시오.

그런 다음 다시 시작해야 할 경우 해당 항목을 차례로 살펴보고 isPlaying을 사용하여 계속 재생 중인지 확인하십시오. 필요한 경우 일시 중지하고 현재 시간을 0으로 설정하고 playAtTime을 다시 호출하십시오. audioDidFinishPlaying에서 플레이어를 제거하지 마십시오. 왜냐하면 당신은 그것들을 다시 만들어야하기 때문입니다. 즉시 다시 재생할 수 있도록 재설정하십시오. 오디오와 함께 더 많은 일을하고 나는 매우 우수한 프레임 워크를 추천 더 제어 및 더 나은 성능을 원하는 놀라운 오디오 엔진 2, AudioKit

+0

답변 감사합니다, FilipD. playAtTime 메서드를 사용하여 타이밍이 가장 정확해야하기 때문에 설명했던대로 플레이어를 설정할 수 없습니다 (원래 시도한 방법입니다). 사실, 같은 시간에 여러 사운드가 재생됩니다. 나는이 문제에 대해 분명히하기 위해 예제를 제거했다. 플레이어가 다음 playAtTime 메서드로 재정의 될 것이므로 playAtTime으로 설정할 때 동일한 플레이어를 여러 번 사용할 수 없습니다 (사운드를 반복해야하는 경우). ... – nontomatic

+0

그래서 유일한 방법은 여러 플레이어가 결국 동일한 사운드 파일을 재생하는 경우에도 사운드 이벤트에 대한 각 플레이어를 초기화하는 것입니다. 코드 예제에서 작성한대로 플레이어를 설정하는 데는 계산이 완료되기까지 몇 초 정도 걸립니다.이 시간 간격 동안 다른 모든 프로세스 (사용자가 다시 행을 터치하는 것과 같은)는 플레이어에 대한 설정이 완료 될 때까지 지연됩니다. 각 플레이어의 콘솔을 실행하는 print 문을 볼 수 있습니다. 이 작업이 완료되면 새로운 설정이 시작됩니다. ... – nontomatic

+0

사용자가 재생을위한 새로운 설정을 요구할 때이 과정을 중단해야합니다. 설치가 끝난 모든 플레이어는 제거해야하지만 (여전히 쉬운 부분 임), 설치를 계속하고있는 모든 플레이어는 즉시 제거해야합니다 (이는 문제입니다). 이 프로세스는 주 스레드에서 발생하기 때문에 이러한 프로세스를 식별하여 대기열에서 제거 할 수있는 방법이 있을지도 모릅니다. 나는 그렇게 할 수 없다. ... – nontomatic