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:方法现在都需要接受 aNSNumber而不是int.

于 2013-01-02T13:56:37.527 回答