2013-03-30 57 views
2

我有一個for ....循環,然後UI在循環中被阻塞。 加速度計是否也被阻擋?加速在一個.....循環

我在viewDidLoad中

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

下面的代碼和進一步向下

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

然後連接到記錄加速度計X時開始一個循環

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

的按鈕的IBAction爲值時,它只顯示按下按鈕時的第一個值,並且不更新whe循環正在運行。相同的第一個值連續重複。 有沒有辦法在循環中記錄加速度?

+1

你的更新間隔爲一秒的1 /第60次。我很確定iPhone或模擬器可以在更短的時間內完成100次迭代的for循環? –

+0

我猜這是不贊成使用委託ios5 + –

+0

是的,我知道,但它只是一個例子,讓說n是無窮然後 –

回答

2

似乎UIAccelerometer需要主線程,因此被for ...循環阻塞。 Core Motion在CMMotionManager對象中還有一個加速度計屬性,可以報告加速度,並且由於Nike +使用的是更好的背景。有兩種訪問方式 - 直接獲取數據的拉式方法或回調。說實話,我只是試了一下,無法讓回調工作(主要是因爲它需要NSOperationQueue,我沒有太多的經驗,所以我可能把它放在錯誤的隊列中),但如果你真行與拉取數據,你的做法似乎需要,那麼這個作品:

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

不是說任何()循環的輪詢應該被認爲是一個嚴重的錯誤,你應該努力消除它。 **永遠不要永遠不會**阻止主事件循環,並且通常不會阻塞隊列或runloop。 – bbum

+0

是不是一個很好的方法來做到這一點,但想到這個問題/方法是一種其他實現方法的抽象。 –

+0

如果這項工作是完美的。謝謝,我的結果很快會回來 –