Не удается запустить executeSelector: afterDelay из блока CoreMotion - PullRequest
1 голос
/ 13 января 2012

У меня проблемы с запуском команды executeSelector afterDelay при обнаружении «щелчка» акселерометра.Обнаружено движение («Получено» зарегистрировано), но по какой-то причине селектор, переданный команде executeSelector, не запускается.

Я установил тестовый блок и успешно запустил executeSelector, поэтомуЯ не думаю, что сами блоки являются причиной проблемы, возможно, это связано с потоком, на котором работает 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
}

1 Ответ

1 голос
/ 16 января 2012

В конце концов я дошел до этого (после того, как вначале возился с идеей перехода на использование метода UIAccelerator для доступа к акселерометру, но затем обнаружил, что это не рекомендуется в будущих выпусках iOS (см. Раздел «Типы событий движения») здесь )

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

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

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

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

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

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

...