【问题标题】:Can we stop the for loop when app goes background当应用程序进入后台时,我们可以停止 for 循环吗
【发布时间】:2014-12-29 13:35:34
【问题描述】:

for 循环正在运行从数组中获取数据(图像和文本),但是当我按下主屏幕按钮时,循环仍然在后台继续并持续超过 5 秒,这是默认时间,它不应该超过我一边用谷歌搜索一边学习。当我按下主页按钮时,应用程序会委托相应的方法,如 appEnterBackground,在完成此循环包含方法后也会调用。那么,按下主页按钮时是否可以中断循环。 请指导。

【问题讨论】:

  • 您可以将长时间运行的代码包装在一个线程中,然后在调用appEnterBackground 方法时停止它。但是引入线程可能会引入各种问题,因此请谨慎操作...

标签: iphone ios7


【解决方案1】:

如果您想检测是否进入后台,除了响应应用程序委托applicationDidEnterBackground 方法外,您还可以将自己注册为UIApplicationDidEnterBackgroundNotification 通知的观察者(例如,使用addObserverForName 方法[NSNotificationCenter defaultCenter])。

注意,如果您想取消您的请求,您需要确保 (a) 请求是异步运行的; (b) 它们是可取消的。如果您的目标是 iOS 7 及更高版本,您可以使用 NSURLSession 完成此操作(例如,dataTaskWithRequestdataTaskWithURL 返回一个 NSURLSessionDataTask 对象,如果需要,您可以在该对象上调用 cancel 方法)。然后,您可以为取消任何未决请求的通知编写一个处理程序。

如果您真的想取消请求,您可以执行上述操作,但如果应用在请求运行时碰巧进入后台,您也可以简单地请求额外的时间来完成请求。通过这种方式,您可以在几分钟内完成请求,而不仅仅是几秒钟。请参阅App Programming Guide for iOS: Background States 中的执行有限长度任务

或者,也许更好的是,您可以将您的任务添加到背景NSURLSession。请参阅上述App Programming Guide for iOS: Background States在后台下载内容部分。这样,即使您的应用程序被暂停(或者,如果您的应用程序由于内存压力而终止),这些任务也将继续执行。如需更多信息,请参阅 WWDC 2013 视频,What's New in Foundation Networking

【讨论】:

  • 请再次研究问题,我没有从后台获取数据,我的问题是数据已经以包含图像和文本数据的字典形式存在于数组中,想要在进入后台时打破 for 循环按下主页按钮后。
  • 这个for 循环在做什么?我假设您正在同步加载数据(因此我讨论了如何将其移出主线程,从而异步执行,然后让它在应用程序进入后台模式时停止加载过程,或者更好的是,在进入后台时无缝继续模式)。但如果不加载数据,你for 循环在做什么?顺便说一句,您永远不会在主线程中执行任何花费超过几毫秒的循环。
猜你喜欢
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多