2

CoreDataを使用してかなり複雑なiPhoneアプリを作成しています。これまで、物事はうまく機能してきました。ただし、アプリがより複雑になるにつれて、新しい問題が発生しました。最初のView Controllerは、AppDelegateがapplicationDidFinishLaunchingメソッドの途中に到達する前に、viewDidLoadメソッドを終了しています。

ビューコントローラは、タブバーコントローラであるルートではありません。問題のVCは、タブバーでデフォルトで選択されているタブのVCです。IBによってインスタンス化されています。

私の経験では、このようなことはこれまでに発生したことはなく、AppDelegateで行っている重要な初期化(Core Dataからオブジェクトを取得して使用するための準備)を破棄しています。さらに、断続的です。デリゲート最初に終了する場合もあります。

他の誰かがこのような困難に気づいたことがありますか?そのような問題を扱うサンプルコードはありますか?

答えは、AppDelegateが準備ができているというメッセージを送信したときにのみ、AppDelegateが準備しているデータをVCにロードさせることだと思います。これが、後でお尻に噛み付くような何かを追加しているのではないかと少し心配しています。

4

2 に答える 2

1

このような競合状態を回避するために私が使用している解決策は、データがロードされて検証されるまで、アプリケーションの機能UIを参照することを完全に控えることです。-applicationDidFinishLaunching:メソッドの先頭で、次のようにします。

  1. サブビューを使用してUIWindowを作成します。
    • サブビューを持つDefault.pngのUIImageView:
      • フレームの中央に配置された(およびアニメーション化された)UIActivityIndi​​catorView
  2. ウィンドウキーを設定して表示し、UIが読み込まれる前にデータ処理が行われていることをユーザーができるだけ早く視覚的にフィードバックできるようにします。
  3. すべてのデータの読み込みと検証を行います(ネットワークアクティビティを含む可能性があります)
  4. UIのメインビューを作成し、Default.pngビューのすぐ下にサブビューとしてウィンドウに追加します。サブビューはフェードアウトされ、スーパービューから削除されます。

ステップ4(サブルーチン呼び出し、非同期通知、Key-Value監視など)をどのように実装するかは、完全にあなた次第です。重要なのは、必要なデータコンポーネントのロードを条件としてUIコンポーネントのロードを行うという考え方です。

これにより、データを気にせずにすべてのUIコードを記述できます。これは、とにかくMVCアプリケーションで実行したいことです。

于 2010-03-13T09:36:02.833 に答える
0

アプリデリゲートの初期化が完了したら、を起動します—これは、おそらくメソッドが実行するNSNotification最後のことです。applicationDidFinishLaunching

同じアプリデリゲートにその通知をリッスンさせ、セレクターを起動します。たとえばloadViewController、セレクターを起動すると、ViewControllerが読み込まれます。

于 2010-03-12T23:10:37.890 に答える