我在我的应用程序中注意到,当应用程序在加载时进入后台时会导致错误,例如“超时”或“找不到主机名”。
这是由于该过程长时间不允许连接在后台运行。
但是这种错误信息会对用户体验造成不利影响。那么我该如何取消交易呢?我应该取消所有连接吗?我试图在SO中搜索Q& A,但找不到答案。
有关更多信息,我的应用程序使用NSURLConnectionDelegate方法。我有一个商店单身人士管理我的服务器的所有连接。 NSURLConnection也在自定义对象中调用和管理。
我尝试在 - applicationDidEnterBackground中只连接[连接取消]:但是这会导致UI被破坏,因为我将数据加载到UITableViewCell等中。任何人都可以指出解决这类问题的例子吗?
更新代码:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
__block UIBackgroundTaskIdentifier backgroundTask; backgroundTask =
[application beginBackgroundTaskWithExpirationHandler: ^ {
[application endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid; }]; }
}
我可以将此代码放入appDelegate吗?这样做的缺点是什么,而不是将beginBackgroundTaskWithExpirationHandler放在我希望在后台和endBackgroundTask完成任务后继续运行的任务之前?我的代码有一个直接处理NSURLConnection的对象。
答案 0 :(得分:3)
在您进入后台后,您可以在一段时间内继续运行NSURLConnection
。 Apple没有公布确切的时间段,但它是10分钟。有关如何使用beginBackgroundTaskWithExpirationHandler:
请求更多时间来完成下载的详细信息,请参阅Executing a Finite-Length Task in the Background。
在大多数情况下,您不应主动取消下载。您应该等到系统过期,然后再处理错误。如果您的下载很简短,则没有理由取消它(在大多数情况下,关于连接的最昂贵的事情是首先设置它)。如果这是一个非常长的下载,那么如果用户不在后台进行,那么用户将会感到恼火。 (这假设您正在下载内容,因为用户请求了它。)
答案 1 :(得分:1)
首先,最好在应用程序委托上进行此调用,以便可以关闭NavigationController中的View。其次,使用beginBackgroundTaskWithExpirationHandler:
标记后台处理的开头,并以endBackgroundTask:
结束,如下所示:
<强>·H 强>
UIBackgroundTaskIdentifier bgTask;
<强>的.m:强>
- (void)sendPhoto:(UIImage *)image
{
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
NSLog(@"Sending picture...");
// Init async NSURLConnection
// ....
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"Picture sent.");
UIApplication *app = [UIApplication sharedApplication];
if (bgTask != UIBackgroundTaskInvalid) {
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
}
还要记住一件重要的事情:
You have 10 minutes before iOS terminates your app. You can check this time with
[app backgroundTimeRemaining
]