0

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

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

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

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

想法?

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

4

1 回答 1

0

我假设您所说的标志是指如果选择器被移动,则设置一个标志。如果是这样,您可以这样做 - 查看选择器代表,当任何或全部被调用时,设置一个标志。如果您的计算是由另一个或多个类完成的,则在这些“已取消”的类上创建一个新属性,选择器可以设置它,并在设置时结束计算。

在开始另一个计算之前,您将清除取消标志,然后开始计算。

您还可以在选择器上方放置一个简单的工具栏(常见做法),您可以在其中拥有可以启动计算、显示进度和取消它的控件。

编辑:如果问题是当用户尝试操作它时选择器卡顿,则子类化 UIPicker,拦截触摸事件,并在触摸选择器时取消所有计算。唯一的复杂情况是,如果用户“旋转”选择器,您会想等到它稳定下来,但您不知道要等待多长时间。根据最后的触摸消息,您必须使用启发式方法等待 didSelectRow: 或在重新开始计算之前超时。

于 2012-08-21T22:01:40.870 回答