GCD и UIBackgroundTaskIdentifier - PullRequest
       34

GCD и UIBackgroundTaskIdentifier

1 голос
/ 16 сентября 2011

У меня есть очередь отправки, в которой есть какая-то работа.Я хочу, чтобы очередь продолжала работать до тех пор, пока не истечет время или не истечет очередь, когда приложение перейдет в фоновый режим.Как бы я настроил UIBackgroundTaskIdentifier?

Нужно ли мне поместить его в блок отправки следующим образом?

    dispatch_async(queue, ^{
        if (_bgTask == UIBackgroundTaskInvalid) {
            if ([UIDevice currentDevice].multitaskingSupported) {
                _bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
                    if (_bgTask != UIBackgroundTaskInvalid) {
                        [[UIApplication sharedApplication] endBackgroundTask:_bgTask];
                        _bgTask = UIBackgroundTaskInvalid;
                    }
                }];
            }
        }

...
...

        if (_bgTask != UIBackgroundTaskInvalid) {
                    [[UIApplication sharedApplication] endBackgroundTask:_bgTask];
                    _bgTask = UIBackgroundTaskInvalid;
                }

            });

Я думаю, что происходит в приведенном выше, это не зарегистрировандолгое задание до тех пор, пока очередь фактически не выполнит блок.Так нужно ли размещать фоновую часть кода за пределами блока, чтобы он выполнялся до того, как фактически встал в очередь?

Ответы [ 2 ]

3 голосов
/ 25 сентября 2011

Я не уверен, почему вы отслеживаете UIBackgroundTaskID в том, что я полагаю, является иваром.Самый простой способ сделать это:

UIBackgroundTaskIdentifier btid = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{...}];
dispatch_async(queue, ^{
    ... // Your code...
    [[UIApplication sharedApplication] endBackgroundTask:btid];
}
1 голос
/ 19 июля 2014

Если у вас есть очередь отправки с рабочими элементами в ней и вы переходите в фоновый режим, очередь продолжит работу над своими задачами в течение 180 секунд (iOS 7 и выше).После этого все автоматически приостанавливается ОС.Так что больше никаких NSThreads, NSTimers и даже NSOperationQueues.Все приостановлено.

Так что я не уверен, какой дополнительный код вы пытаетесь добавить на своем прикладном уровне для достижения того, что вы пытаетесь сделать.Поставляется предварительно собранным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...