私は RubyMotion を初めて使用し、いくつかの API を理解するのに苦労しています。
私のアプリは非常に基本的な一連の UITable リストです。アイテムを選択すると、そのアイテムのリストに移動します。これは、新しいコントローラーを押すことによって実現されます。
これはすべて正常に動作しますが、リスト コントローラーの 1 つの viewDidLoad メソッドで、インターネットからリストのデータを更新するメソッドを呼び出しています。非同期ディスパッチ キューで更新を実行しているので、viewDidLoad は次のようになります。
def viewDidLoad
super
loadItems
Dispatch::Queue.concurrent.async do
refreshItems
end
end
私が抱えている問題は、このリストに移動し、更新が完了するのを待ってから (デバッグログのテーリングを介して)、戻って別のリストに戻る場合です。更新が完了すると、セグメンテーション違反であることが確実に通知された説明のないエラーでアプリケーションがクラッシュします。
したがって、コントローラを閉じる前にリフレッシュが完了するのを待つか、コントローラを閉じる前に Dispatch キューからリフレッシュ スレッドを強制終了する必要があると確信しています。だから私の質問は:
左上を押して戻って現在のコントローラーを閉じるときに、「戻る」イベントをどのようにキャッチしますか? コントローラーを押すとこの機能を無料で利用できますが、バックイベントをキャッチする方法がわかりません。
コントローラーを閉じる前に更新スレッドを強制終了するか、それが完了するのを待つだけの正しいアプローチはどれですか? それを殺すのは少し危険に思えます。おそらく、実行していることを終了して終了するように要求するメッセージを送信し、OK 完了という応答を待つことができます。
質問 2 の正しい答えをどのように達成しますか? ディスパッチされたスレッドからメインスレッドにメッセージを送り返す方法を知っていれば、これは少し簡単になります。