3

私は RubyMotion を初めて使用し、いくつかの API を理解するのに苦労しています。

私のアプリは非常に基本的な一連の UITable リストです。アイテムを選択すると、そのアイテムのリストに移動します。これは、新しいコントローラーを押すことによって実現されます。

これはすべて正常に動作しますが、リスト コントローラーの 1 つの viewDidLoad メソッドで、インターネットからリストのデータを更新するメソッドを呼び出しています。非同期ディスパッチ キューで更新を実行しているので、viewDidLoad は次のようになります。

def viewDidLoad
  super

  loadItems

  Dispatch::Queue.concurrent.async do
    refreshItems
  end
end

私が抱えている問題は、このリストに移動し、更新が完了するのを待ってから (デバッグログのテーリングを介して)、戻って別のリストに戻る場合です。更新が完了すると、セグメンテーション違反であることが確実に通知された説明のないエラーでアプリケーションがクラッシュします。

したがって、コントローラを閉じる前にリフレッシュが完了するのを待つか、コントローラを閉じる前に Dispatch キューからリフレッシュ スレッドを強制終了する必要があると確信しています。だから私の質問は:

  1. 左上を押して戻って現在のコントローラーを閉じるときに、「戻る」イベントをどのようにキャッチしますか? コントローラーを押すとこの機能を無料で利用できますが、バックイベントをキャッチする方法がわかりません。

  2. コントローラーを閉じる前に更新スレッドを強制終了するか、それが完了するのを待つだけの正しいアプローチはどれですか? それを殺すのは少し危険に思えます。おそらく、実行していることを終了して終了するように要求するメッセージを送信し、OK 完了という応答を待つことができます。

  3. 質問 2 の正しい答えをどのように達成しますか? ディスパッチされたスレッドからメインスレッドにメッセージを送り返す方法を知っていれば、これは少し簡単になります。

4

2 に答える 2

0

非同期呼び出しの外側でインスタンス変数を設定し、更新ループ内で確認します。離れるときは「false」に設定してください。

def viewDidLoad
  super

  loadItems

  @refresh = true

  Dispatch::Queue.concurrent.async do
    refreshItems
  end
end

def refreshItems
  # inside your loop
    if @refresh
      # stuff
    end
  # end loop
end

def viewWillDisappear(animated)
  @refresh = false

  super
end
于 2012-10-17T21:33:06.480 に答える
0

ビューで「更新完了」通知をリッスンできますか?

viewDidLoad では、view 自体が通知のリスナーとして登録され、バックグラウンド リフレッシュが開始されます。

Refresh が処理を開始します。

ユーザーがタッチバックすると、viewDidUnload でビューが通知のリッスンを停止し、表示されなくなります。

更新が完了し (私のアプリでは、これは CoreData に書き込まれます)、ビューが存在するかどうかにかかわらず通知を送信します。

ビューが存在する場合、ビュー内の通知ハンドラーがデータをフェッチし、UI を更新します。

于 2013-08-01T13:48:18.053 に答える