2012-01-13 1 views
1

У меня возникли проблемы с срабатыванием команды Performer afterDelay после обнаружения акселерометра «flick». Движение обнаружено («Got here» зарегистрирован), но по какой-то причине селектор, переданный команде performSelector, не запускается.Невозможно выполнить выполнение. Выбор: afterDelay из блока CoreMotion.

Я установил тестовый блок и успешно выполнил из этого элемент performSelector, поэтому я не думаю, что сами блоки создают проблему, возможно, это связано с потоком, который работает CoreMotion? (Я должен признать, что он слегка туман на блоках/нитях/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 заблокирован, ожидая большего. –

+0

Большое спасибо за совет @DavidDunham, см. Ниже для более подробной информации, но проблема оказалась связанной с потоком. – Ted

ответ

1

Я получил там в конце (после первого поигрывая с идеей перехода к использованию метода UIAccelerator о доступе к акселерометру - но потом обнаружил, что это должно быть устаревшим в будущих версиях IOS (смотрите раздел " Типы Motion Event»here)

в основном код в блоке, выполняется при обнаружении движения, не может быть запущен на главном потоке, что может вызвать проблемы, особенно с UIView кода, связанного.

путь убедитесь, что код выполняется в основном потоке для вызова:

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

вместо обычного:

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

О, я нашел решение в книгах выдержке Google с отличным ищет Beginning IPhone 4 Development: Exploring the IOS SDK. Надеюсь, это может быть полезно для людей, борющихся в одной и той же области, не стесняйтесь комментировать, если вы хотите получить больше информации/кода.

+0

Я немного смущен - я не вижу никакого кода, который требует основной поток в исходном вопросе. –