我在我的应用程序中使用了MBProgressHUD库,但有时当我查询大量数据时,进度HUD甚至没有显示,或者在数据处理完成后立即显示(到那时我不再需要显示HUD(。
在另一篇文章中,我发现有时UI运行周期非常繁忙,以至于无法完全刷新,因此我使用了一个部分解决我问题的解决方案:现在每个请求都会提高HUD,但几乎一半的时间是应用程序崩溃。为什么?这就是我需要帮助的地方。
我有一个表视图,在委托方法didSelectRowAtIndexPath中,我有以下代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[NSThread detachNewThreadSelector:@selector(showHUD) toTarget:self withObject:nil];
...
}
然后,我有这个方法:
- (void)showHUD {
@autoreleasepool {
[HUD show:YES];
}
}
在其他时候,我只是打电话:
[HUD hide:YES];
好吧,当它工作时,它可以工作,hud显示,停留然后按预期消失,有时它只是使应用程序崩溃。错误:EXC_BAD_ACCESS 。为什么?
顺便说一下,HUD对象已经在viewDidLoad中分配了:
- (void)viewDidLoad
{
[super viewDidLoad];
...
// Allocating HUD
HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
[self.navigationController.view addSubview:HUD];
HUD.labelText = @"Checking";
HUD.detailsLabelText = @"Products";
HUD.dimBackground = YES;
}
您需要在另一个线程上执行处理,否则处理将阻塞 MBProgressHud 绘制,直到它完成,此时 MBProgressHud 将再次隐藏。
NSThread 对于卸载处理来说有点太低级了。我建议使用Grand Central Dispatch或NSOperationQueue。
http://jeffreysambells.com/2013/03/01/asynchronous-operations-in-ios-with-grand-central-dispatchhttp://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues
/* Prepare the UI before the processing starts (i.e. show MBProgressHud) */
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/* Processing here */
dispatch_async(dispatch_get_main_queue(), ^{
/* Update the UI here (i.e. hide MBProgressHud, etc..) */
});
});
此代码段将允许您在将处理调度到另一个线程之前在主线程上执行任何 UI 工作。然后,一旦处理完成,它就会返回到主线程,以允许您更新 UI。