0

UIPickerViewが計算タスクによって「飢え」ている状況があります。つまり、非常に重い計算タスクが発生しているため、UIPickerViewが更新されることはなく、したがってメッセージが送信されることもありません。ピッカーは計算の側面を制御するので、2つはうまく機能する必要があります。

別のスレッドで計算を実行することを考えました。そのようにすると、ピッカーは自由に更新できるようになります。ただし、計算をマルチスレッド可能にするのは大変な作業になるので、別の解決策を見つけたいと思います。

ピッカー(または他のUIコントロール)がコードブロックの実行を「プリエンプション」することは可能ですか?計算はループ内にあります。反復回数が重くなります。ピッカーがどこかにフラグを設定することさえできれば、ループはそれ自体を壊す可能性があり、それはプログラムのフローで機能します。

ループがピッカーをポーリングできる場合は、それも機能します。しかし、私はそれを行う方法を見つけていません。

アイデア?

(ps。昨日同様の質問を投稿しましたが、実際には正しく質問していませんでした。当時の問題が何であったかはよくわかりませんでした。)

4

1 に答える 1

0

フラグとは、ピッカーを動かした場合にフラグを立てることを意味していると思います。もしそうなら、あなたはこれを行うことができます-ピッカーデリゲートを見て、それらのいずれかまたはすべてが呼び出されたら、フラグを設定します。計算が別のクラスによって行われる場合は、それらのクラスに「キャンセル」された新しいプロパティを作成します。ピッカーはそれを設定でき、設定すると計算が終了します。

別の計算を開始する前に、そのキャンセルフラグをクリアしてから、計算を開始します。

ピッカーの上にシンプルなツールバーを配置することもできます(一般的な方法)。ここには、計算を開始したり、進行状況を表示したり、キャンセルしたりできるコントロールがあります。

編集:問題が、ユーザーが操作しようとしているときにピッカーが途切れていることである場合は、UIPickerをサブクラス化し、タッチイベントをインターセプトし、ピッカーがタッチされている間に、すべての計算をキャンセルします。唯一の厄介な問題は、ユーザーがピッカーを「スピン」した場合、ピッカーが落ち着くまで待ちたいが、どれくらい待つかわからないことです。最後のタッチメッセージに応じて、ヒューリスティックを使用してdidSelectRow:を待機するか、計算を再開する前にタイムアウトする必要があります。

于 2012-08-21T22:01:40.870 に答える