长时间运行任务问题

时间:2013-01-31 07:00:48

标签: iphone ios

我正在实施长时间运行的任务,以便将位置更新发送到服务器。我每隔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或者一个会解决目的?

谢谢

1 个答案:

答案 0 :(得分:1)

你的dispatch_async()到后台队列完全没有意义。它不仅没有意义,它可能不安全(取决于其他代码访问timerLocationUpdateToServer属性以及它是否是原子的)。您应该用

替换整个第一个代码块
self.timerLocationUpdateToServer = [NSTimer scheduledTimerWithTimeInterval:interval
                                                                    target:self
                                                                  selector:selector(retryLocationUpdateToServer)
                                                                  userInfo:nil
                                                                   repeats:YES];

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