- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 VoIP iOS 应用程序使用长轮询机制来维护其服务连接和接收事件(调用)。这意味着,NSURLConnection
会等待几分钟,但会在事件发生后立即返回。由于 VoIP 标志,即使应用程序处于后台模式,也可以设置保持事件处理程序并接收更新。
然而,这在大多数情况下都有效但不可靠。有时,即使在请求超时(达到 NSURLRequest
的 timeoutInterval
)之后,NSURLConnection
回调也会严重延迟或根本不会触发。
日志中的示例以阐明:
NSURLConnection
#1(长轮询)启动并在 1 分钟后返回一些新数据NSURLConnection
#2(长轮询)启动并在 15 分钟(服务器端最大值)后返回,没有任何新数据NSURLConnection
#99(长轮询)已启动但不返回 - 即使 timeoutInterval
过期(16 分钟)backgroundTimeRemaining
属性获得了不切实际的高值(1797693134862315708145274237317043567980705675258449965989174768031572607800285387605895586327668 7817154045895351438246423432132688946418276846754670353751698604991057655128207624549009038932894407586850845513339423045832 36903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0
而不是最大值 180.0
)。NSURLRequest
并接收响应NSURLConnection
#99 回调 didFailWithError
被触发并出现超时错误 (-1001)。此请求的执行时间超过 1 小时,即使 timeoutInterval
被限制在 16 分钟内,还有其他几个请求较晚启动但较早完成。在我看来,这似乎是 iOS 的一种非常奇怪的行为。为什么 iOS 应该为应用程序提供后台执行时间并调用保持事件处理程序,但不能及时正确触发 NSURLConnection 回调?
保持事件处理程序:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{
NSLog(@"########### Started Keep-Alive Handler ###########");
[self startBackgroundHandler:YES timeout:30];
NSLog(@"########### Completed Keep-Alive Handler ###########");
}];
[self startBackgroundHandler:NO timeout:60];
}
-(void)startBackgroundHandler:(BOOL)force timeout:(int)timeout {
UIApplicationState currentAppState = [[UIApplication sharedApplication] applicationState];
BOOL appIsBackground = currentAppState == UIApplicationStateBackground;
if(appIsBackground || force) {
int localThreadId = ++_currentBackgroundThreadId;
__block UIBackgroundTaskIdentifier bgTask;
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
// Clean up any unfinished task business by marking where you
// stopped or ending the task outright.
NSLog(@"Cleaning up [Background Thread %d] ...", localThreadId);
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
NSLog(@"startBackgroundHandler with [Background Thread %d] appIsBackground=%d force=%d", localThreadId, appIsBackground, force);
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if(_currentBackgroundThreadId == localThreadId) {
NSLog(@"[Background Thread %d] Background time left: %0.1f", localThreadId, [UIApplication
sharedApplication].backgroundTimeRemaining);
sleep(timeout);
}
NSLog(@"[Background Thread %d] Will exit...", localThreadId);
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
} else {
NSLog(@"Ignored startBackgroundHandler - appIsBackground=%d force=%d", appIsBackground, force);
}
}
所有 NSURLConnections 都有一个 runloop - 它们启动如下:
NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:mrequest delegate:self startImmediately:NO];
if(connection) {
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[connection start];
} else {
// error handling...
}
附言:在较早版本的应用程序中,使用data fetch
后台模式而不是voip
,并且从未遇到过此类问题。
最佳答案
当你在后台时,iOS 似乎不愿意在主线程上给你 CPU 时间——即使你有 VoIP 标志。因此,您应该在单独的线程中安排您的请求,并使用 CFRunLoopRun()
使其在后台运行。此外,您必须在运行循环中使用 runMode:beforeDate:
以适当的模式触发执行。
但真正的问题是,如果请求超时太频繁,iOS 将停止提供 CPU 时间——您确实需要接收任何东西才能获得 CPU 时间。因此,让WebServer及时回复很重要。
关于iOS:NSURLConnection 回调严重延迟或根本未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26141460/
我遇到了一个似乎很独特的问题。我的 NSUbiquitousKeyValueStore 在模拟器中的启动之间根本不起作用。也就是说,我什至不是在谈论 iCloud 同步或类似的东西,我无法让它通过下面
首先,我使用的是 WiX 版本 3.5.2519.0,但我也在最新的 3.6 版本上测试了它,结果相同。 我很难确定 PatchFamily 究竟能过滤掉 torch 生成的差异的某些部分。按照手册中
我可以获取要呈现的“帮助主题”标题,但无法获取我定义的任何FIXTURES。 {{#each model}} 中的任何内容都不会渲染。这是我第一次使用 Ember,所以任何东西(字面意义上的任何东
我一直在尝试设置custom ajaxTransports for jQuery在我们的产品的某些场景下缩短某些工作流程。然而,我在让这些传输受到尊重方面取得了零成功(而我有很多工作 custom a
为什么纯无类型 lambda 演算经常被描述为无法使用? 有了合适的函数库,它会不会与任何其他函数式语言大致相同? 最佳答案 速度不是大问题。例如,您可以决定使用教堂数字但优化实现,以便像往常一样表示
我是一名优秀的程序员,十分优秀!