0

私は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ときに呼び出す必要があります。updateDatahideLoadingOverlay

問題は、メインスレッドで実行されるため、データの更新中にオーバーレイを表示する方法がわからないことです。updateData通知を送信する前に直接表示し、メソッドの最後で非表示にしようとしましたが、機能していません。

どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

0

おそらく、メインスレッドでもスケジュールされているアニメーションを使用していますが、updateData が実行された後です。その場合、 updateData が呼び出される前にアニメーションが開始されるようにしてください。たとえば、次のようなことができます。

- (void)updateReceived:(NSNotification*)notification {
    [self startAnimationOnComplete: ^{
        [self performSelectorOnMainThread:@selector(updateData:) withObject:nil waitUntilDone:NO];
    }]
} 
于 2013-02-14T08:44:58.050 に答える