我对后台任务的概念性问题。
我需要在后台处理耗时的任务。该任务由滑块操作触发。现在,在主线程上运行任务时,滑块不会作出反应,因为滑块值的第一次更改会触发长计算。这对用户交互很不利。
我想使用NSOperation
将任务放在后台,但我不知道如何处理快速更改的滑块值。当输入值再次改变时,有没有办法立即停止/重启启动的后台任务?
一个选项可能是使用NSOperationQueue
并且只要滑块被激活就删除队列中未开始的过期任务?!?
由于
答案 0 :(得分:1)
如果我理解你的问题,你基本上需要让你的线程知道主UI线程的变化。你可以这样做:
在主线程中创建具有滑块值的公共属性。将指针传递给主要控制器/视图,该属性向工作线程公开。这样工作线程可以在需要时读取该值。
在工作线程中,在循环中进行计算或以其他方式经常检查该值,如果值已更改,则更改逻辑或重新开始计算。
答案 1 :(得分:1)
您可以使用带有NSPostWhenIdle
样式通知(https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Notifications/Articles/NotificationQueues.html#//apple_ref/doc/uid/20000217-115535)的主线程通知队列来启动后台任务。
可以通过NSOperation
上的NSOperationQueue
启动后台任务。 NSOperation
支持取消,您的后台任务需要定期检查isCancelled
标记。如果用户在后台任务正在进行时继续滑动,则需要取消该任务并再次发布NSPostWhenIdle
次通知。