【问题标题】:handle changing requests for background task处理后台任务的更改请求
【发布时间】:2013-12-18 16:01:18
【问题描述】:

关于后台任务的概念性问题。

我需要在后台处理一项耗时的任务。该任务由滑块动作触发。现在,在主线程上运行任务时,滑块不会做出反应,因为滑块值的第一次更改会触发长计算。这不利于用户交互。

我想使用NSOperation 将任务置于后台,但我不知道如何处理快速变化的滑块值。当输入值再次更改时,有没有办法立即停止/重新启动已启动的后台任务? 一种选择可能是使用NSOperationQueue,只要滑块被激活,就删除队列中未启动的过时任务?!?

谢谢

【问题讨论】:

  • 是否需要在用户滑动的时候进行计算,或者可以等到用户暂停后再计算?
  • 不,这就是我要完成的任务。只要滑块被激活并且正在更改计算的输入,就不应该有计算运行。

标签: ios cocoa-touch background-process nsoperation


【解决方案1】:

您可以使用带有NSPostWhenIdle 样式通知(https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Notifications/Articles/NotificationQueues.html#//apple_ref/doc/uid/20000217-115535)的主线程通知队列来启动后台任务。

后台任务可以通过在NSOperationQueue上启动NSOperation来完成。 NSOperation 支持取消,您的后台任务需要定期检查isCancelled 标志。如果用户在后台任务进行时继续滑动,您需要取消任务并再次发布NSPostWhenIdle 通知。

【讨论】:

  • 感谢您的建议。给我一些时间检查一下。
【解决方案2】:

如果我正确理解您的问题,您基本上需要让您的线程知道主 UI 线程的变化。你可以这样做:

  1. 在主线程中创建具有滑块值的公共属性。将指针传递给主控制器/视图,该属性在该处暴露给工作线程。这样,工作线程可以在需要时读取该值。

  2. 在工作线程中进行循环计算或以其他方式经常检查该值并更改逻辑或在值已更改时重新开始计算。

【讨论】:

  • 感谢您的建议。给我一些时间检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2020-01-28
  • 2015-07-10
  • 1970-01-01
相关资源
最近更新 更多