0

MBProgressHUDを使用して、ipad アプリでログアウトしているときに概要の読み込み画面を作成しています。大きなファイルをいくつか暗号化する必要があるため、この処理には時間がかかります。

私はバックグラウンド スレッドで実行しており、MBProgressHUDはメイン スレッドでアニメーション化されているため、バックグラウンド スレッドがいつ終了したかを知るために何かをしなければなりませんでした。

テストとして、私はそれを次のようにしました:

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDAnimationFade;
hud.labelText = @"Do something...";

[self performSelectorInBackground:@selector(doSomethingElse) withObject:nil];

メソッド doSomethingElse:

-(void)doSomethingElse
{
    [self encrypt];
    [self performSelectorOnMainThread:@selector(doSomethingElseDone) withObject:nil waitUntilDone:YES];
}

メソッド doSomethingElseDone:

-(void)logoutInBackgroundDone
{
    [MBProgressHUD hideHUDForView:self.view animated:YES];    
}

解決策は機能しますが、もっと良い方法があるに違いないと思いますか? どうすればより良い方法でそれを行うことができますか?

どんな助けでも本当に感謝しています。

4

2 に答える 2

2

MBProgressHUDを使用してfromdoSomethingElseメソッドを直接閉じることができますdispatch_async

-(void)doSomethingElse
{
    [self encrypt];
    dispatch_async(dispatch_get_main_queue(), ^{
         [MBProgressHUD hideHUDForView:self.view animated:YES];
    });
}
于 2012-11-19T11:11:37.250 に答える
0

取得できるアトミック プロパティを作成する

@property BOOL spinning;

- (void)myTask
{
    while ( self.spinning )
    {
        usleep(1000*250); // 1/4 second
    }
}

次に、View Controllerで次のようなものを使用します

HUD = [[MBProgressHUD alloc] initWithView:self.view];
[self.view addSubview:HUD];
[HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES];

このようにして、回転が false になると HUD が自動的に削除されます。スピナーはバックグラウンド スレッドで参照されるため、アトミックである必要があります。待っているものは何でも、任意のスレッドからスピナー プロパティを false に設定するだけで、完了したことを示すことができます。

これはARCの下にあります。

于 2012-11-19T14:20:21.373 に答える