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

Я пытаюсь разработать приложение для 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]);
        }
    }];

}

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

...