0

私はこのようなケースを持っています: 私のアプリは画像をサーバーにアップロードする必要があり、アップロードのステータスをユーザーに表示したいと考えています。たとえば、4 つの画像を選択し、アプリが画像 1 をアップロードしているとき、hud テキスト ラベルには、画像 2 をアップロードするときに「画像 1/4 をアップロードしています」と表示され、「画像 2/4 をアップロードしています」と表示されます。アップロード プロセスをバックエンドに配置するため、アップロード プロセスがメイン スレッドで実行されるとします。このため、画像のアップロード時にメイン スレッドがブロックされます。そのため、hud はすぐには機能しません。これを修正する方法、誰でも助けることができますか? 私のコードは次のようなものです:

        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        hud.dimBackground = YES;
        hud.labelText = @"";
        //show the hud
        for (int i = 0;i<[self.images count];i++) {
            hud.labelText = self.maskTitle;//change hud lable text
            [self uploadImage:i];//upload image, this would take long, will block main thread
        }
4

1 に答える 1

2

メインスレッドで重い操作を実行するべきではありませんが、本当にしたい場合は次のようにすることができます

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.dimBackground = YES;
hud.labelText = @"";
//show the hud
for (int i = 0;i<[self.images count];i++) {
    hud.labelText = self.maskTitle;//change hud lable text
    [self performSelector:@selector(uploadImage:) withObject:@i afterDelay:0.001];        
}

遅延を挿入するとNSRunLoop、画像のアップロードを開始する前に がそのサイクルを完了することができるため、UI が更新されます。これは、UIKit が の現在の繰り返しの最後に描画するためですNSRunLoop

NSRunLoop別の方法は、たとえば、手動で実行することです

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.dimBackground = YES;
hud.labelText = @"";
//show the hud
for (int i = 0;i<[self.images count];i++) {
    hud.labelText = self.maskTitle;//change hud lable text
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantPast]];
    [self performSelector:@selector(uploadImage:) withObject:@i afterDelay:0];        
}

両方の例で、メソッドが の代わりにuploadImage:を受け入れる必要があることに注意してください。NSNumberint

于 2013-01-02T13:56:37.527 に答える