Почему обновления движения ядра не работают при вызове через другой объект в этом коде?
@interface Tester()
{
int currentAccelerationOnYaxis;
}
@end
@implementation Tester
-(void) test
{
CMMotionManager *motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 0.01;
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMDeviceMotion *motion, NSError *error)
{
currentAccelerationOnYaxis = motion.userAcceleration.y;
}
];
while(1==1)
{
NSLog(@"current acceleration is: %f", currentAccelerationOnYaxis);
}
}
@end
Затем я выполняю описанный выше метод в фоновом потоке, как это :[myTester performSelectorInBackground:@selector(test) withObject:nil];
И это прекрасно работает.
Однако, следующая конфигурация не работает, и я не могу понять, почему:
@implementation MotionHandler
@synthesize accelerationOnYaxis; // this is an int property of the MotionHandler class
-(void) startAccelerationUpdates
{
CMMotionManager *motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 0.01;
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMDeviceMotion *motion, NSError *error)
{
self.accelerationOnYaxis = motion.userAcceleration.y;
}
];
}
@implementation Tester
-(id)init
{
//...
currentMotionHandler = [[MotionHandler alloc] init];
}
-(void) test
{
[currentMotionHandler startAccelerationUpdates];
while(1==1)
{
NSLog(@"current acceleration is: %f", currentMotionHandler.accelerationOnYaxis);
}
}
@end
Затем я выполняю описанный выше метод в фоновом потоке, как это :[myTester performSelectorInBackground:@selector(test) withObject:nil];
И это не работает, почему это ?
1 ответ:
Я понял это. В моей 2-й версии экземпляр CMMotionManager, который я создавал, по какой-то причине потерялся. Поэтому я изменил реализацию моего класса MotionHandler следующим образом:
Мотионхендлер.m
@interface MotionHandler() { //.. CMMotionManager *motionManager; // I now declare it here } @implementation MotionHandler @synthesize accelerationOnYaxis; // this is an int property of the MotionHandler class -(void) startAccelerationUpdates { motionManager = [[CMMotionManager alloc] init]; // and then initialize it here.. motionManager.deviceMotionUpdateInterval = 0.01; [motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) { self.accelerationOnYaxis = motion.userAcceleration.y; } ]; } -(void)test { [self startAccelerationUpdates]; while(1==1) { NSLog(@"current acceleration on y-axis is: %f", self.accelerationOnYaxis); } }
И теперь, кажется, все работает нормально.