gpt4 book ai didi

ios - 单个生命周期长的ios后台任务(voip)

转载 作者:行者123 更新时间:2023-12-01 16:52:55 28 4
gpt4 key购买 nike

我正在开发一个需要定期(经常)在后台执行某些工作的应用程序,即使该应用程序本身未显示。我已经宣布它为VOIP应用程序,使其启动,甚至在10分钟(600秒)后自动重新启动。该应用程序不适用于App Store。

大约300-400秒后,系统会产生一个新线程(正确),但不会关闭最后一个线程。这意味着每隔600秒就会产生一个新线程,从而增加了我的应用程序的内存和电池消耗。不好。

那么关于创建新线程后如何关闭第一个衍生线程的任何线索?

一旦应用关闭,此代码将启动后台处理程序。它还定期以600秒的间隔启动新的处理程序

- (void)applicationDidEnterBackground:(UIApplication *)application
{
isInBackground = YES;
BOOL backgroundAccepted = [[UIApplication sharedApplication]
setKeepAliveTimeout:600 handler:^{ [self startBackgroundHandler]; }];
if (backgroundAccepted)
{
NSLog(@"VOIP backgrounding accepted");
}
[self startBackgroundHandler];
}

此代码启动一个线程,该线程定期执行一些工作(每5s):
- (void)startBackgroundHandler
{
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];

// Start the long-running task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while (1)
{
NSLog(@"BGTime left: %f", [UIApplication
sharedApplication].backgroundTimeRemaining);
sleep(5);
}
});
}

最佳答案

一直为此苦苦挣扎了一段时间,但是在这里写完Stackoverflow之后才想出了一个解决方案。

刚更换

while (1)


int localThreadId = ++threadId;
while (threadId == localThreadId)

其中线程ID是一个整数。因此,当一个新线程启动时,threadId增加而旧线程停止。

关于ios - 单个生命周期长的ios后台任务(voip),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14231679/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com