在for循环中显示MBProgressHUD

时间:2013-01-02 13:37:59

标签: ios mbprogresshud

我有这样的案例: 我的应用程序需要将图像上传到服务器,我想向用户显示上传状态。 例如,我选择4个图像,当应用程序上传图像1时,hud文本标签应显示“上传图像1/4” 上传图片2时, 显示“正在上传图片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
        }

1 个答案:

答案 0 :(得分: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:方法现在都需要接受NSNumber而不是int