문제

내가 사용하여 AVAudioPlayer 음악을 재생하는 내 아이폰 응용 프로그램입니다.

클래스에서는 내가 쓴 나는 배열을 포함하는 임의의 오름차순으로 정수입니다.(2, 4, 9, 17, 18, 20,...) 이러한 정수를 나타내는 시대에서 노래에는 특정 이벤트가 발생합니다.그래서 만약 당신은 위의 배열을,2 초 후에 노래의 놀고,어떤 메소드가 호출되어야 합니다.4 초 후에,다른 메소드가 호출되어야 합니다.그래서.

나는 시도를 사용하여 반복 NSTimer:

NSTimer *myTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerTick) userInfo:nil repeats:YES];

마다 그것은 화재 여부를 확인의 가치고 현재 arrayindex 는 마찬가지입니다.

- (void) timerTick {
   if([[myArray objectAtIndex:currentIndex] intValue] == (int)(player.currentTime)) {
   //here the event-method is called
   currentIndex++;
   }
}

이 코드를 실제로 작동하지만 일부 시간이다.몇 시간 후에는 그러나,myTimer 타이머 컨트롤하는 musicplayer 에 동기화되지 않는 경우가 있습니다.그래서 그것을 그리워하는 요소를 보유하고 무한 반복을 시작합니다.지 정확히 알고 왜 그들의 동기화,그러나 내가 생각하기 때문일 수 있습 타이머 플레이어 없이 시작되는 동시에 정확히거나기 때문에 어쩌면의 짧은 성능이 떨어진다.

나는 내가 이것에 접근하는 완전히 다른 방법이다.는 키 값을 관찰하는 방법이 있을까요?추 내류 관찰자로하 플레이어,객체는 알림을 받을 때입니다.currentTime 값을 변경합니다.그러나 그것의 많은 원인에게 알림을 보내고 나는 생각한 것은 정말 나쁜 성능을 향상시킬 수 있습니다.

어떤 도움이 많이 감사드립니다!

도움이 되었습니까?

해결책

Ok 여기에는 나의 솔루션:내가 찾는 오픈 소스 응용 프로그램은 거의 동일한 것을 내용해야 하는 나에게 많은 도움이됩니다.저는 코드가 이미 있고,조금 수정해야 정확한을 위해 충분히 나의 목적이다.그것은 여기:

currentIndex = 0;
myTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(timerTick) userInfo:nil repeats:YES];


- (void) timerTick {
 if(timerRunning){


     if([[myArray objectAtIndex:currentIndex] intValue] <= (int)(player.currentTime*100)) { 
         //some event code
         currentIndex++;
     }
 }
}

중요한 변경은==하기 <=에는 경우-상태입니다.면 비동기 그리워하는 요소의 보유,오류를 수정한 다음 백니다.그것은 좋은 충분합니다.

당신의 도움을 주셔서 감사합니다!

다른 팁

그것은 될 수 있는 타이머는 합리적인 동기화,그러나 당신의 코드만을 실행하는(i.e:더 이상 다음 1 초)입니다.

할 수 없었 당신은 단지 타이머를 사용하의 musicplayer 에,산란이 스레드는 각 이벤트 발생?이 방법으로 타이머 유지에 중단되지 않고 스레드에 할 것이 무엇이 필요하(말할 수 있습 무거운 물건).

는 경우에 당신은 당신 y 필요한 두 가지 타이머,나는 당신을 만들 수 있습 백그라운드 스레드 유지하는 그 두 가지 타이머 동기화,그러나 나는 당신을 생각한 문제에 대한 질문가..

실제 세계 동기화와 음악은 매우 어렵기 때문에 사용자가 알 수 있습니다 mis-기의 단지 십분의 두 번째 또는 적습니다.는 것을 찾을 수 있습니다 AVAudioPlayer 를 위해 간단하게 당신이 필요합니다.수도 있어 음악을 평가 놀이용 AudioQueueServices 할 수 있도록 동기화 음악하는 코드 대신 다른 방법이다.당신이 볼 수 있는 시간을 당신의 코드고 다음 시작하는 방법을하기 전에 음악을 실제로 재생됩니다.수행 능숙하게 이것은 동기화 음악의 대부분의 시간입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top