UIPickerView“抢先”消息?

时间:2012-08-21 21:07:57

标签: objective-c ios multithreading uipickerview nsrunloop

我的情况是我的UIPickerView被计算任务“饿死”了;换句话说,UIPickerView永远不会更新 - 因此永远不会发送消息 - 因为正在发生非常繁重的计算任务。选择器控制计算的各个方面,因此两者必须发挥得很好。

我想过在一个单独的线程中运行计算。似乎这样会让选择器自由更新。然而,让我的计算能够多线程化是一项艰巨的任务,所以我想找到另一种解决方案。

选择器(或其他UI控件)是否可以“抢占”代码块的执行?计算是循环的;迭代次数使其变得沉重。如果选择器甚至可以在某处设置标志,则循环可能会自行中断,这可能与程序的流程有关。

如果循环可以轮询选择器,那也可以。但是,我还没有办法做到这一点。

想法?

(ps。我昨天发布了一个类似的问题,但并没有真正正确地问它 - 当时不太清楚问题是什么!)

1 个答案:

答案 0 :(得分:0)

我认为你的意思是如果移动了选择器,设置一个标志。如果是这样,你可以这样做 - 查看选择器委托,当它们中的任何一个或全部被调用时,设置一个标志。如果你的计算是由另一个或多个类完成的,那么在那些“取消”的类上创建一个新属性,选择器可以设置它,并在设置时计算结束。

在开始另一次计算之前,你会清除取消标记,然后开始计算。

您还可以在选择器(常规练习)上方放置一个简单的工具栏,您可以在其中拥有可以开始计算,显示进度和取消它的控件。

编辑:如果问题是当用户试图操纵它时选择器是断断续续的,那么子类UIPicker,拦截触摸事件,并且在触摸选择器时,取消所有计算。唯一的复杂因素是,如果用户“旋转”选择器,你需要等到它结束,但你不知道要等多久。根据最后的触摸消息,您必须使用启发式等待didSelectRow:或重新启动计算之前的超时。