MBProgressHUD
是一个嵌入式的iOS类,它在后台线程工作时在前台UI显示带有指示符或者半透明的标签.
用法
在运行长时间的任务时,需要遵循的主要准则是保持主线程不工作,因此可以及时更新UI。因此,是在主线程上使用MBProgressHUD,然后将要执行的任务旋转到新线程上。
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
// 任务代码
dispatch_async(dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUDForView:self.view animated:YES];
});
});
您可以在任何view中添加HUD.但是避免将HUD添加到UIKit
具有复杂视图层次结构的某些视图, 比如UITableView
或UICollectionView
,这样可能以意想不到的方式改变他们的子视图,从而破坏HUD显示。
使用mode
属性来配置你的HUD
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeAnnularDeterminate;
hud.label.text = @"Loading";
[self doSomethingInBackgroundWithProgressCallback:^(float progress) {
hud.progress = progress;
} completionCallback:^{
[hud hideAnimated:YES];
}];
使用一个NSProgress
对象,当通过该对象报告进度时,MBProgressHUD会自动更新
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeAnnularDeterminate;
hud.label.text = @"Loading";
NSProgress *progress = [self doSomethingInBackgroundCompletion:^{
[hud hideAnimated:YES];
}];
hud.progressObject = progress;
UI更新,倾向于调用MBProgressHUD
应始终在主线程上完成。
如果你需要在主线程中运行你的长时间运行的任务,你应该稍微延迟一点,所以UIKit将有足够的时间来更新UI(即绘制HUD),然后用你的任务阻塞主线程。
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// Do something...
[MBProgressHUD hideHUDForView:self.view animated:YES];
});
网友评论