gpt4 book ai didi

ios - 带有 NSTimers 和服务器调用的后台模式

转载 作者:行者123 更新时间:2023-11-28 19:40:06 25 4
gpt4 key购买 nike

我正在开发一个 sdk,它使用 NSTimer 在 x 分钟过期时发出服务器调用,服务器调用在完成一些工作后将计时器重置回 x 分钟。我遇到的问题是当我的应用程序在后台时我的计时器停止运行,当我的应用程序回到前台时立即恢复。我如何让它发挥作用?

//initialize self.myTimer somewhere in my code
//called once somewhere in my code-->[self resetTimer:self.myTimer expiry:30];

- (void)resetTimer:(NSTimer *)timer expiry:(float)seconds {
[timer invalidate];
NSTimer *newTimer = [NSTimer timerWithTimeInterval:seconds
target:self
selector:@selector(updateTimer:)
userInfo:nil
repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:newTimer forMode:NSRunLoopCommonModes];

self.myTimer = newTimer;

}

- (void) updateTimer:(NSTimer *)timer {

[timer invalidate];

dispatch_queue_t queue = dispatch_queue_create("update", NULL);
dispatch_async(queue, ^{
[self serverCall];
});
}

-(void)serverCall{
//make server call and do some work
[self resetTimer:self.myTimer expiry:30];


}

最佳答案

当应用程序处于后台时,计时器不会继续触发。如果您愿意让操作系统设置服务器调用的速度,您可以通过引用此 background execution doc 中的“机会性地获取少量内容”部分来完成此操作。 .

要点是设置您应用的 UIBackgroundModes key == 在 info.plist 中获取。

当 iOS 决定授予您的应用一些周期时,您可以在以下时间运行一个任务:

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
[self serverCall]; // BUT! read on
}

但是你需要重构你的 serverCall完成后告诉调用者。否则,您将不知道何时调用 completionHandler: .

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
[self newServerCallWithCompletion:^(BOOL gotNewData) {
UIBackgroundFetchResult result = (gotNewData)? UIBackgroundFetchResultNewData : UIBackgroundFetchResultNoData;
completionHandler(result);
}];
}

有关 UIBackgroundFetchResult 的更多选项,请参阅文档.

有了这个,iOS 将设置请求的速度,因此您将无法更频繁地发出请求,而不是在您的应用有机会时发出请求。通过保留上次请求的时间,您可以更少发出请求。只需检查自上次请求以来的间隔是否为 <=到某个所需的最大频率。如果是,只需立即用“无数据”调用 c​​ompletionHandler。

关于ios - 带有 NSTimers 和服务器调用的后台模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34887655/

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