2012-01-13 59 views
1

我在檢測到加速度計「輕彈」時觸發performSelector afterDelay命令時遇到問題。檢測到移動('已到此處'記錄),但由於某些原因,傳遞給performSelector命令的選擇器未觸發。無法運行performSelector:來自CoreMotion的afterDelay塊

我設置了一個測試塊,併成功運行了一個performSelector,所以我不認爲塊本身導致了問題,這可能與CoreMotion運行的線程有關。 (我必須承認在block/threads/CoreMotion上略顯朦朧)

任何線索將不勝感激。謝謝。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //Do any additional setup after loading the view, typically from a nib. 

    motionManager = [[CMMotionManager alloc] init]; 
    if(motionManager.accelerometerAvailable) 
    { 
     motionManager.accelerometerUpdateInterval = 0.1; 
     NSOperationQueue *motionQueue = [[NSOperationQueue alloc] init]; 
     [motionManager startAccelerometerUpdatesToQueue: motionQueue withHandler: ^(CMAccelerometerData *data, NSError *error) 
     { 
      float accelerationThreshold = 1.2; 

      CMAcceleration userAcceleration = data.acceleration; 
      if (fabs(userAcceleration.x) > accelerationThreshold)    
      { 
       NSLog(@"Got here"); //runs 
       [self performSelector:@selector(test) withObject:nil afterDelay:1.0]; 
      } 
     }]; 
    } 
} 

-(void) test 
{ 
    NSLog(@"perform selector after delay worked"); //doesn't run 
} 
+0

您是否獲得了更多的加速計數據?也許NSOperationQueue被阻止等待更多。 – 2012-01-14 01:14:28

+0

非常感謝@DavidDunham的建議,請參閱下面的更多細節,但問題原來是與線程相關的。 – Ted 2012-01-16 15:46:52

回答

1

我到底到了那裏(先用切換到使用訪問加速度計的UIAccelerator方法的想法醞釀後 - 但後來發現,這是未來的iOS版本中被棄用(參看「運動事件類型」 here

基本上代碼塊中,可以不在主線程上運行檢測到運動時執行,這可能會導致問題,特別是與UIView的相關的代碼。

的方式來確保主線程上執行的代碼是調用:

[self performSelectorOnMainThread:@selector(test) withObject:nil waitUntilDone:false]; 

而不是正常的:

[self performSelector:@selector(test) withObject:nil afterDelay:1.0]; 

哦,我發現從優秀在谷歌圖書摘錄的解決方案看Beginning IPhone 4 Development: Exploring the IOS SDK。希望這可能對在同一領域掙扎的人有用,如果您想要更多信息/代碼,請隨時發表評論。

+0

我有點困惑 - 我沒有看到任何需要原始問題主線程的代碼。 – 2012-01-16 17:20:47

相關問題