活动指示器作为一个表视图加载另一个

时间:2010-08-19 11:58:45

标签: iphone activity-indicator

我一直在尝试大约一天让表格单元格在加载新视图时显示活动指示器。在didSelectRowAtIndexPath上,我想在以下运行时显示指标

[self.navigationController pushViewController:subKeywordController animated:YES];

然后,该控制器运行相当密集的SQL查询

我在网上搜索并阅读了几十篇帖子,但似乎没有任何帮助解决我的具体问题。我知道我需要在另一个线程中运行指示器,因为推送和后续加载优先,但我不确定如何做到这一点。我之前考虑过在控制器中运行SQL查询,但这种情况非常混乱。

奇怪的是,我一直在使用MBProgressHUD在同一个表视图中显示忙碌游标而没有任何问题。只有当我应用搜索然后选择导致此错误的结果之一时:

bool _WebTryThreadLock(bool),0x1d79b0:尝试从主线程或Web线程以外的线程获取Web锁。这可能是从辅助线程调用UIKit的结果。现在崩溃......

应用程序在iPhone上继续运行,但崩溃了模拟器。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

问题是您在控制器中的任务是否占用了UI代码(但您可能已经知道了!)。解决这个问题的一种便宜而简单的方法是使用计时器启动慢速任务(在本例中为SQL查询)稍有延迟:

- (void)viewDidLoad {
    [super viewDidLoad];

    // instead of running the SQL here, run it in a little bit
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(doSQL:) userInfo:nil repeats:NO];

    // Show the please wait stuff
    [activityIndicator setHidden:NO];
}

- (void)doSQL:(NSTimer *)timer {
    // Do your sql here
}

另一种解决方法是将SQL移动到一个单独的线程中:

- (void)viewDidLoad {
    [super viewDidLoad];

    // instead of running the SQL here, run it in a little bit
    [self performSelectorInBackground:@selector(doSQL) withObject:nil];

    // Show the please wait stuff
    [activityIndicator setHidden:NO];
}

- (void)doSQL {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Do your sql here

    // Tell the main thread
    [self performSelectorOnMainThread:@selector(doneSQL) userInfo:nil waitUntilDone:YES];

    // Cleanup
    [pool release];
}

- (void)doneSQL {
    // Update your UI here
}

希望有所帮助!