UIAlertView加载指示器不在辅助线程中工作

时间:2012-11-05 12:07:32

标签: objective-c ios

我有以下UIAlertView加载指示器的代码,该指示器无效并且给我

- (void) launchActivity
{
 //some logic...
[NSThread detachNewThreadSelector:@selector(updateFilterProgress) toTarget:self withObject:nil];
}
- (void) updateFilterProgress {
 if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
{
    UIAlertView *myAlert = [[[UIAlertView alloc] initWithTitle:@"No Internet Connectivity" message:@"This app require an internet connection via WiFi or cellular network to work." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil] autorelease];
    [myAlert show];
}
else{
    UIAlertView *alertMe = [[[UIAlertView alloc] initWithTitle:@"Loading..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease] ;


  //tried this way by placing below line....no result   
  [alertMe performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];
    //[alertMe show];

 //some logic...
}

更新 在主线程上,我调用web服务并加载数据。因此我给了另一个加载UIAlertView的线程,它正在使用iOS 4,5。但它在iOS 6中崩溃。如果我在主线程上放置AlerView然后在加载任何内容时显示但在获取数据后,AlertView显示加载指示器几秒钟。任何建议......

3 个答案:

答案 0 :(得分:1)

您必须从主线程中显示分离线程的警报,使用GCD或performSelectorOnMainThread


在主线程上,您通常只想执行UI更新,所有复杂的计算和数据加载都将在分离的线程中执行。如果您尝试在主线程中加载数据,则在加载期间UI将不会响应。因此,在分离的线程中加载数据是一个很好的做法,在主线程上,您在加载开始时显示警报,并在加载(和解析)完成时关闭它,同时调用内容UI更新:

Load/Refresh datasource flow

答案 1 :(得分:1)

这是一种不好的做法。

Apple文档说您需要处理主线程上的UI元素。

我认为问题在于这一行:

[NSThread detachNewThreadSelector:@selector(updateFilterProgress) toTarget:self withObject:nil];

您不会在其他线程上而不是在主线程上处理UI元素。

使用:

[self updateFilterProgress];

或使用如:

[yourAlert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];

我还检查了你的代码。弹出一个错误:

错误是:'UIAlertView'没有可见的@interface声明选择器'performSelectorOnCurrentThread:withObject:waitUntilDone:'

performSelectorOnMainThread对我来说非常合适。

答案 2 :(得分:0)

试试这个

- (void) launchActivity
{
 //some logic...
[NSThread detachNewThreadSelector:@selector(updateFilterProgress) toTarget:self withObject:nil];
}
- (void) updateFilterProgress {
 if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
{
    [self performSelectorOnMainThread: @selector(showAlertForNoNetConnect)];
}
else{
    [self performSelectorOnMainThread: @selector(showAlertForLoading)];
 //some logic...
}

- (void) showAlertForNoNetConnect
{
    UIAlertView *myAlert = [[[UIAlertView alloc] initWithTitle:@"No Internet Connectivity" message:@"This app require an internet connection via WiFi or cellular network to work." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil] autorelease];
    [myAlert show];

}
- (void) showAlertForLoading
{
    UIAlertView *alertMe = [[[UIAlertView alloc] initWithTitle:@"Loading..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease] ;
    [alertMe show];

}

您必须调用主线程中的所有UIKit元素。这就是问题所在。 希望这可以帮助。快乐的编码。 :)