Сохранение данных высокочастотного (100 Гц) датчика с использованием executeBackgroundTask в Core Data Приводит к потере данных и сбоям приложения?

Я пытаюсь разработать приложение watchOS, которое собирает данные датчика (ускорителя) с очень высокой частотой (100 Гц). Я использую Core Data для хранения данных и их экспорта в файл CSV, а затем отправляю их на iPhone.

Приложение рухнуло через короткое время, потому что память какого-то потока превысила ограничение. И я также узнал, что метод "executeBackgroundTask" создает слишком много потоков, и загрузка ЦП превышает 100%.

Другая проблема заключается в том, что когда я получаю данные, я получаю больше элементов данных, чем на самом деле хранится в базе данных Sqlite, что весьма запутанно.

Ниже приведен код и метод вызывается в этом методе ([self.motionManager startDeviceMotionUpdatesToQueue:self.queue withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error) {}]) блок обратного вызова:

- (void)workoutManager:(nonnull id)manager didReceiveAccelerationData:(nonnull YLAcceleration *)acceleration {

    NSString *dateTime = [self.dateFormatter stringFromDate:[NSDate date]];
    [self.coreDataStack.persistentContainer performBackgroundTask:^(NSManagedObjectContext * _Nonnull context) {
        Acceleration *accData = [[Acceleration alloc] initWithContext:context];
        accData.x = acceleration.xString;
        accData.y = acceleration.yString;
        accData.z = acceleration.zString;
        accData.heartRate = self.heartRate;
        accData.dateTime = dateTime;
        accData.session = self.currentSession;
        NSError *saveError = nil;
        [context save:&saveError];
        if (error) {
            NSLog(@"Save data failed:%@", error);
        }else{
            NSLog(@"Save data succeeded:%@", [NSThread currentThread]);
        }
    }];

}

Заранее спасибо.

0 ответов

Другие вопросы по тегам