【问题标题】:NSURLConnection and multitasking in iOSiOS 中的 NSURLConnection 和多任务处理
【发布时间】:2011-05-16 21:26:39
【问题描述】:

我正在使用NSURLConnection 在 iOS 中异步下载资源。 (它们是大型 PDF 文件,因此连接速度较慢需要一些时间。)

现在我正在将我的应用程序从 iOS 3 更新到 iOS 4。由于我的应用程序没有位置感知、voip 和背景音乐,我想我需要做点什么。

那么,我的问题是,当前运行的NSURLConnection 会发生什么?当应用程序回到前台时,它是暂停并神奇地恢复,还是直接被杀死?如果是后者,以后自动恢复的标准策略是什么?是否有 NSURLConnection 的开源子类可以自动执行此操作?

【问题讨论】:

  • 发表您对该主题的研究,对我和其他人都有帮助:)

标签: cocoa-touch ios4 nsurlconnection multitasking


【解决方案1】:

您可以启动最多运行 10 分钟的任务。考虑为此目的使用beginBackgroundTaskWithExpirationHandler: API。请注意,如果您的任务花费的时间过长,它将被操作系统杀死。

【讨论】:

  • 这并不能真正回答问题......'那么,我的问题是,当前运行的 NSURLConnection 会发生什么?当应用程序回到前台时,它是暂停并神奇地恢复,还是直接被杀死?'
  • 确实如此。 ANY 代码只有 4 种情况下被放入后台,它们是你提到的三种情况,加上这一种。您需要在应用程序开始转换状态之前的某个时间点启动后台任务,以确保在用户退出时下载继续在后台运行。如果您需要取消任务,也有相应的 API。
  • 应用恢复后NSURLConnection会发生什么?我会收到connection:didFail...: 代表消息吗?
  • 那么我想正确的做法是创建一个NSURLConnection 的子类,它会监听didEnterBackground 通知...
  • 这不是正确的方法。正确的方法是在 beginBackgroundTaskWithExpirationHandler: 块内启动您的 NSURLConnection。
【解决方案2】:

当应用程序进入前台时,NSURLConnection 确实被暂停并重新启动。如果应用程序从暂停状态变为未运行状态,请确保您终止连接:

- (void)applicationWillTerminate:(UIApplication *)application {
    if (self.downloadConnection != nil){
        [self.downloadConnection cancel];
    }
}

【讨论】:

  • 呃,应用终止时连接不是自动终止的吗?
  • 是的,当应用程序终止时连接被终止,但不是当应用程序进入后台时。
  • 这没用。 1. 使用多任务处理的应用程序(所以今天的所有应用程序)不使用 applicationWillTerminate: 方法。 2.当应用关闭时,如果应用生命周期结束后自动取消和释放,为什么还要取消请求? 3. 当应用程序进入后台时,NSURLConnections 也不应该被杀死,所以cancelapproach 在任何意义上都是错误的。
猜你喜欢
  • 2013-11-24
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多