2011-10-20 11 views
0

初期設定時にSQLiteデータベースに初期データをロードする必要がある、かなり簡単なiPhoneアプリケーションをアップデートしています。 DSActivityViewクラスを使用して、「しばらくお待ちください」というメッセージを表示しています。データの読み込みには、WiFiでは約15秒、3Gでは約30-45秒かかります。iPhoneの初期データロードと「しばらくお待ちください」画面

このプロセス全体は、私のアプリケーションデリゲートのアプリケーション:didFinishLaunchingWithOptionsメソッドに由来しています。

データロードプロシージャは、8つのテーブルごとにUpdateTableというNSOperationオブジェクトのインスタンスを作成することによって、別のスレッドで起動されています。各操作はNSOperationQueueに配置され、解放されます。データロードはチャンピオンのように機能します。

チャンピオンのようなものではないものは何ですか?ただし、「しばらくお待ちください」ビューをメインのナビゲーションコントローラビューに置き換えています。

最初のアプローチは、次のことを実行するために私のアプリデリゲートのメソッドを呼び出しNSInvocationOperationをインスタンス化することでした:

- (void) loadNavController; 
{ 
    [window addSubview:[navigationController view]]; 
    [window makeKeyAndVisible]; 
    [defaultImageView removeFromSuperview]; 

    [DSBezelActivityView removeViewAnimated:YES]; 
} 

最後UpdateTable操作を添加した後、この操作はキューに追加されました。

このアプローチがバグである理由は、NSInvocationOperationがスレッド内の他のプロセスと並行して実行されるためです。したがって、最後のテーブルの更新が実行される前に上記のメソッドが起動します。

だから私は、次のアプローチを試みた:

を:(ここで、JSONとのSQLiteのすべてが行われている)私のUpdateTable.mで

を、私は最後のテーブルの更新が完了した直後に実行するために次の行を入力します

[appDelegate performSelectorOnMainThread:@selector(loadNavController) withObject:nil waitUntilDone:NO]; 

このアプローチはタイミングが適切ですが、メインのUNavigationControllerオブジェクトとUIWindowオブジェクトは両方ともloadNavControllerを実行してnilでした。いくつかのデバッグブレークを設定すると、loadNavControllerメソッドが実行される前に、私のアプリケーションデリゲートのdellocメソッドが起動していたことに気付きました。両方のオブジェクトは、App DelegateでIBOutlets(非原子、保持)として設定されているIBOutletsを介してMainWindowに割り当てられます。私はdeallocがなぜ発砲しているのかという手がかりを持っていません。このプロセスは合計で10秒未満です。

あなたがレンダリングする可能性がありますすべての支援をいただければ幸いです。事前に多くの感謝。

VB

+0

あなたのアプリケーションデリゲートの 'application:didFinishLaunchingWithOptions'メソッドでYESを返していますか? –

+0

@MihaiFratu:はい、私はこのメソッドの最後にYESを返します。 –

答えて

1

このスレッドをソリューションで更新するための速記です。

performSelectorOnMainThreadのアプローチが正しいことが判明しました。セレクタが呼び出されたときからNavControllerオブジェクトがnilだった理由は、アプリデリゲートの新しいインスタンスを作成するため、私にした:

AppDelegate *appDelegate = [AppDelegate alloc] init]; 

の代わりに、既存のオブジェクト参照:魔法のように

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

ワークス。

関連する問題