2013-03-30 4 views
2

for ... for 루프가 있고 루프에있을 때 UI가 차단됩니다. 가속도계도 차단 되었습니까?for ..... 루프에서의 가속

I는 상기 다운

- (void)accelerometer:(UIAccelerometer *)acel didAccelerate:(UIAcceleration *)acceleration { 
    acc=acceleration.x; 
} 

의 viewDidLoad

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer]; 
    accel.delegate = self; 
    accel.updateInterval = 1.0f/60.0f; 
} 

코드는 다음과 한 후, 가속도 센서 (X)를 기록 할 때 루프

- (IBAction)doSomething { 
    for (int n = 1; n<=100;n++) { 
     // do someting in the loop 
     NSLog(@"x: %g", acc); 
    } 
} 

에게 시작 버튼에 연결된 IBAction를 값은 버튼을 눌렀을 때 첫 번째 값만 표시하고 whe는 업데이트하지 않습니다. n 루프가 실행 중입니다. 동일한 첫 번째 값이 연속적으로 반복됩니다. 루프에 가속을 기록하는 방법이 있습니까?

+1

업데이트 간격은 1/60 초입니다. 아이폰이나 시뮬레이터가 for-loop의 반복을 100 번 이상 완료 할 수있을 것이라고 확신한다. –

+0

그리고 iOS5 +에서 대리모가 사용되지 않는 것 같습니다. –

+0

예, 알고 있습니다.하지만 그냥 예일뿐입니다. n이 무한하다고 가정 해 봅시다. –

답변

2

UIAccelerometer는 주 스레드를 필요로하므로 for ... 루프에 의해 차단됩니다. 코어 모션은 가속을보고 할 수있는 CMMotionManager 객체의 가속도계 속성을 가지고 있으며 Nike +가 사용하는 것이므로 더 나은 역 주변을 수행합니다. 데이터에 직접 액세스하거나 콜백 (call-back)하는 두 가지 방법이 있습니다. 솔직히 말해서, 나는 단지 그것을 시도하고 작동하도록 콜백을 얻을 수 없다 (대부분 NSOperationQueue를 필요로하기 때문에 나는 아마도 잘못된 큐에 넣을 것이므로 많은 경험이 없다). if if 당신은 다음이 작동, 당신의 접근 방식이 필요로하는 것 같다 당겨 데이터와 확인 위치 :

CMMotionManager *motionManager = [[CMMotionManager alloc] init]; 
[motionManager startAccelerometerUpdates]; 

for (int i = 0; i < 10000; i++) 
{ 
    NSLog(@"Acceleration: %f", motionManager.accelerometerData.acceleration.x); 
} 

난 그냥 장치에 그것을 시도하고 값은 현재 가속과 용 루프 업데이트에보고했다.

출처 : UIBackgroundModes and UIAccelerometer

+1

() 루프에 대한 어떤 종류의 폴링도 심각한 버그로 간주되지 않으므로 제거하려고 노력해야합니다. ** 결코 메인 이벤트 루프를 차단하지 않으며 절대로 큐 또는 런 루프를 차단하지 마십시오. – bbum

+0

네가 할 수있는 좋은 방법은 아니지만이 질문/방법이 다른 구현 방법의 추상이라고 생각했습니다. –

+0

이것이 효과가 있다면 완벽합니다. 고마워, 내 결과로 곧 돌아올거야 –