输入背景时的NSURLConnection最佳实践

时间:2013-08-03 15:50:31

标签: ios nsurlconnection nsurlconnectiondelegate

我在我的应用程序中注意到,当应用程序在加载时进入后台时会导致错误,例如“超时”或“找不到主机名”。

这是由于该过程长时间不允许连接在后台运行。

但是这种错误信息会对用户体验造成不利影响。那么我该如何取消交易呢?我应该取消所有连接吗?我试图在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的对象。

2 个答案:

答案 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]