Ускорение не вызывается, когда акселерометр инициализируется в beginBackgroundTaskWithExpirationHandler? - PullRequest
0 голосов
/ 12 декабря 2010

В моем приложении я хочу записать данные акселерометра, когда приложение входит в фоновый режим (достаточно времени, предоставленного системой).Я кодировал это следующим образом:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    UIDevice* device = [UIDevice currentDevice];
    BOOL backgroundSupported = NO;

    if ([device respondsToSelector:@selector(isMultitaskingSupported)])
        backgroundSupported = device.multitaskingSupported;


    if (backgroundSupported) {
        UIApplication*    app = [UIApplication sharedApplication];

        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }];

        // Start the long-running task and return immediately.
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
            ^{
            // Do the work associated with the task.
            if ([application backgroundTimeRemaining] > 1.0 ) {
                UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
                accel.delegate = self;
                accel.updateInterval = kUpdateInterval;
            }          
        });

В делегате, о котором я упоминал, вроде:

- (void) accelerometer:(UIAccelerometer *)accelerometer 
    didAccelerate:(UIAcceleration *)acceleration {

    if (acceleration.x > kAccelerationThreshold || 
        acceleration.y > kAccelerationThreshold ||
        acceleration.z > kAccelerationThreshold) {

        NSLog(@"Sensed acceleration");
        UILocalNotification *localNotif = [[UILocalNotification alloc] init];

Однако, didAccelerate не запускается, когда приложение входит в фоновый режим, скорее оно вызываетсяпосле примененияWillEnterForeground.После перезапуска приложения (из фона) didAccelerate запускается несколько раз (возможно, количество раз, когда значение акселерометра менялось в фоновом режиме).Похоже, что запрос накапливается и выполняется, когда приложение выходит на передний план.

Есть ли способ записать значение акселерометра, когда приложение находится в фоновом состоянии (внутри beginBackgroundTaskWithExpirationHandler)

Пожалуйста, помогите.

1 Ответ

1 голос
/ 16 декабря 2010

Ваш код запускается как есть , а затем завершение работы приложения продолжается в обычном режиме.Другими словами, ваш код, связанный с акселерометром, не является синхронным и, таким образом, не будет блокировать процесс выхода .

Прочтите еще раз комментарий:

// Start the long-running task and return immediately.

Ваша задача"продолжительный", к сожалению.

...