I’m attempting to log accelerometer data to the CoreData sql database in a logging application I’ve written as an aid to another project. The application is simple: It logs acceleration data to a structure created in Core Data at a frequency of f=100Hz.
Everything is great, except I’m getting a real frequency in the database of closer to 5Hz or at low at 0.1Hz in some test cases.
I’ve setup the accelerometer per the documentation:
// Accelerometer
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
accelerometer.updateInterval = 1./100; // T = 1/f. f=100Hz.
accelerometer.delegate = self;
Then on the callback I simply log it to a new row in Core Data:
- (void)accelerometer:(UIAccelerometer *)accelerometer
didAccelerate:(UIAcceleration *)acceleration{
AccelerometerData *dataPoint = [NSEntityDescription insertNewObjectForEntityForName:@"AccelerometerData" inManagedObjectContext:self.managedObjectContext];
[self.session addAccelerometerDataObject:dataPoint];
dataPoint.x = [NSNumber numberWithDouble:acceleration.x];
dataPoint.y = [NSNumber numberWithDouble:acceleration.y];
dataPoint.z = [NSNumber numberWithDouble:acceleration.z];
dataPoint.timestamp = [NSNumber numberWithDouble:acceleration.timestamp];
Any idea why the lack of data?
I’m getting much higher frequencies from Core Location. I know inserting a new row into a managed entity is expensive – but I can’t image it being on the scale of 1/100 of a second!
Got this working… seems like a bug to me though. I have to set the updateInterval to 1/10 of the desired time. I.e. for 100Hz refresh rate I set it to 1./1000 and I get 100 Hz data. Strange.