0

我在我的 ipad 应用程序中注销时使用MBProgressHUD制作概览加载屏幕。这一进展需要一些时间,因为我必须加密一些更大的文件。

因为我在后台线程中执行此操作并且MBProgressHUD正在主线程上进行动画处理,所以我必须做一些事情才能知道我的后台线程何时完成。

作为测试,我是这样做的:

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDAnimationFade;
hud.labelText = @"Do something...";

[self performSelectorInBackground:@selector(doSomethingElse) withObject:nil];

和方法doSomethingElse:

-(void)doSomethingElse
{
    [self encrypt];
    [self performSelectorOnMainThread:@selector(doSomethingElseDone) withObject:nil waitUntilDone:YES];
}

和方法doSomethingElseDone:

-(void)logoutInBackgroundDone
{
    [MBProgressHUD hideHUDForView:self.view animated:YES];    
}

该解决方案有效,但我认为必须有更好的方法?我怎样才能以更好的方式做到这一点?

非常感谢任何帮助。

4

2 回答 2

2

您可以使用直接关闭MBProgressHUDfromdoSomethingElse方法dispatch_async

-(void)doSomethingElse
{
    [self encrypt];
    dispatch_async(dispatch_get_main_queue(), ^{
         [MBProgressHUD hideHUDForView:self.view animated:YES];
    });
}
于 2012-11-19T11:11:37.250 回答
0

创建一个可以访问的原子属性

@property BOOL spinning;

- (void)myTask
{
    while ( self.spinning )
    {
        usleep(1000*250); // 1/4 second
    }
}

然后在你的视图控制器中使用一些东西,比如

HUD = [[MBProgressHUD alloc] initWithView:self.view];
[self.view addSubview:HUD];
[HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES];

这样,当旋转变为假时,HUD 将自行移除。微调器必须是原子的,因为它将在后台线程中引用。无论您在等待什么,都可以简单地将任何线程的 spinner 属性设置为 false 以表明它已完成。

这是在 ARC 下。

于 2012-11-19T14:20:21.373 回答