1

我正在执行将位置更新发送到服务器的长时间运行任务。我每 60 秒后使用 NSTimer 调用方法。我阅读了他们使用以下代码的许多帖子。

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            self.timerLocationUpdateToServer = [NSTimer timerWithTimeInterval:interval
                                                                       target:self
                                                                     selector:@selector(retryLocationUpdateToServer)
                                                                     userInfo:nil
                                                                      repeats:YES];

            dispatch_async(dispatch_get_main_queue(), ^{
                [[NSRunLoop mainRunLoop] addTimer:self.timerLocationUpdateToServer forMode:NSDefaultRunLoopMode];

            });
        });

我们真的需要使用 dispatch_async 吗?如果是,那么为什么?

有些人使用两个标识符,一个用于计时器,另一个用于任务。

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

    }];

    bgTask1 = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask1];
        bgTask1 = UIBackgroundTaskInvalid;

    }];

我们是否需要初始化两个 UIBackgroundTaksIndentifier 或者一个就可以解决问题?

谢谢

4

1 回答 1

1

dispatch_async()到后台队列是完全没有意义的。它不仅没有意义,而且可能不安全(取决于其他代码访问该timerLocationUpdateToServer属性以及它是否是原子的)。您应该将整个第一个代码块替换为

self.timerLocationUpdateToServer = [NSTimer scheduledTimerWithTimeInterval:interval
                                                                    target:self
                                                                  selector:selector(retryLocationUpdateToServer)
                                                                  userInfo:nil
                                                                   repeats:YES];

同样在第二个代码块中,您只需要一个后台任务标识符。多个将起作用,但如果您可以管理它,实际上只使用一个会更有效(因为开始后台任务不是免费的)。

于 2013-01-31T07:56:11.890 回答