我有这样的案例: 我的应用程序需要将图像上传到服务器,我想向用户显示上传状态。 例如,我选择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
}
答案 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
。