2013-05-31 2 views
0

휴대 전화의 위치를 ​​결정하기 위해 가속도계 데이터를 통해 내 응용 프로그램이 반복적으로 반복되도록 코드를 설정했습니다. 휴대 전화의 Z 좌표를 가져올 수 있기를 원합니다. 그들에 기초한 행동을 부르십시오.가속도계를 사용하여 void 만 한 번만 호출하십시오.

if (.3 > filter.z && filter.z > -.3){ 
     NSLog(@"STRAIGHT = %f", filter.z); 


    } 
    else if (1.3 > filter.z && filter.z > .7){ 
     NSLog(@"DOWN = %f", filter.z); 
     [self performSelector:@selector(loadNextFlag) withObject:nil 
        afterDelay:1.0]; 
    } 
    else if (-.4 > filter.z && filter.z > -1.3){ 
      NSLog(@"UP = %f", filter.z); 
    } 

이 코드는 작동합니다

는 지금은이 있습니다. 전화가 향하고있는 방향을 알고 정보를 올바르게 기록합니다. 작동하지 않는 것은 performSelector입니다. 휴대 전화를 아래로 기울이면 가속도계가 좌표 정보를 지속적으로 새로 고침하기 때문에 performSelector 액션이 몇 초 내에 많은 시간 호출되어 앱이 다운됩니다. 누구든지 Z 좌표를 추적하면서 휴대 전화를 아래로 기울일 때마다 한 번만 작업을 호출 할 수있는 방법을 알고 있습니까?

답변

0

이 내가 그것을 밖으로 작동하는 방법이다. 다음과 같은 부울 값을 추가했습니다.

BOOl isPaused; 

이렇게하면 내 전화기를 아래쪽으로 기울일 때마다 작업을 호출 할 수있었습니다. 이 같은 : 대답에 대한

if (.3 > filter.z && filter.z > -.3){ 
     NSLog(@"STRAIGHT = %f", filter.z); 
     isPaused = NO; 

    } 
    else if (1.3 > filter.z && filter.z > .7 && !isPaused){ 
     NSLog(@"DOWN = %f", filter.z); 
     [self performSelector:@selector(submitGuess:) withObject:nil 
        afterDelay:0.2]; 
     isPaused = YES; 
    } 
    else if (-.4 > filter.z && filter.z > -1.3){ 
      NSLog(@"UP = %f", filter.z); 
    } 
} 
1

GCD의 dispatch_async을 사용하여 멀티 스레딩을 사용하여 메인 (또는 다른) 스레드를 한 번씩 업데이트하면서 변경 사항을 추적 할 수 있습니다. 다음 예제에서는 백그라운드 스레드에서 데이터를 샘플링 만에 한 번씩 20 개 샘플을 loadNextFlag를 호출됩니다

__block int sampleCount = 0; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{ 
    if (.3 > filter.z && filter.z > -.3){ 
     NSLog(@"STRAIGHT = %f", filter.z); 


    } 
    else if (1.3 > filter.z && filter.z > .7){ 
     NSLog(@"DOWN = %f", filter.z); 
     if (sampleCount >= 20) { 
      sampleCount = 0; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [self loadNextFlag]; 
      }); 
     } else { 
      sampleCount++; 
     } 
    } 
    else if (-.4 > filter.z && filter.z > -1.3){ 
     NSLog(@"UP = %f", filter.z); 
    } 

}); 
+0

감사합니다, 나는 실제로 다음 아래로 기울어 진 직선 다시 기울어 때 가속도계 정보를 다시 시작할 때 가속도계를 일시 정지하는 부울 값을 추가하여 해결했다. 따라서 모든 틸트가 작동 할 때만 한 번씩 동작을 호출합니다. –

관련 문제