我正在实施长时间运行的任务,以便将位置更新发送到服务器。我每隔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或者一个会解决目的?
谢谢
答案 0 :(得分:1)
你的dispatch_async()
到后台队列完全没有意义。它不仅没有意义,它可能不安全(取决于其他代码访问timerLocationUpdateToServer
属性以及它是否是原子的)。您应该用
self.timerLocationUpdateToServer = [NSTimer scheduledTimerWithTimeInterval:interval
target:self
selector:selector(retryLocationUpdateToServer)
userInfo:nil
repeats:YES];
类似地,在第二个代码块中,您只需要一个后台任务标识符。多个将工作,但如果你可以管理它,实际上只使用一个更有效(因为开始后台任务不是免费的)。