私はiPhoneアプリケーションに取り組んでいます。
サーバーから非同期更新を行っています。アップデートのダウンロードが完了したら、NSNotification を発行します
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_DATA_RECEIVED object:self userInfo:@{ @"updateKey": updateKey }];
私のviewControllerでは、オブザーバーを宣言しました
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateReceived:) name:NOTIFICATION_DATA_RECEIVED object:nil];
そして、通知が受信されたときに実行されるセレクター:
- (void) updateReceived:(NSNotification *)notification
{
[self performSelectorOnMainThread:@selector(updateData:) withObject:nil waitUntilDone:NO];
}
updateData
コア データのエンティティが変更され、特定のライブラリを使用しない限り、別の脅威では実行できないため、メイン スレッドで実行する必要があります。私はそれを変えたくありません。
私の問題:
updateData
メインスレッド上にあるため、しばらく時間がかかり、UI がフリーズしています。これが行われている間、「Loading Data...」オーバーレイを表示する必要があります。
オーバーレイを表示するView Controllerに2つのメソッドがあります:showLoadingOverlay
およびhideLoadingOverlay
が呼び出されたときと完了したshowLoadingOverlay
ときに呼び出す必要があります。updateData
hideLoadingOverlay
問題は、メインスレッドで実行されるため、データの更新中にオーバーレイを表示する方法がわからないことです。updateData
通知を送信する前に直接表示し、メソッドの最後で非表示にしようとしましたが、機能していません。
どんな助けでも大歓迎です。
ありがとう