У меня возникли проблемы с срабатыванием команды 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
}
Вы получаете больше данных акселерометра? Возможно, NSOperationQueue заблокирован, ожидая большего. –
Большое спасибо за совет @DavidDunham, см. Ниже для более подробной информации, но проблема оказалась связанной с потоком. – Ted