任务完成后关闭UIAlertView

时间:2011-07-26 19:12:38

标签: iphone objective-c multithreading xcode uialertview

在我的应用程序中,我有一个高级搜索页面,它使用带有4个单元格的tableview基本上作为下拉字段访问4个tableviews。这些是从解析我从url请求中收到的xml的结果填充的,该url请求在应用程序首次加载时发生并存储在appDelegate中,以便稍后在访问高级搜索页面时由tableviews访问。在正常的,良好的互联网连接情况下,这需要一瞬间,所以信息远在adv之前。甚至可以访问搜索页面,但我想在连接速度很慢的情况下保护自己。 因此,如果我设置的标志为false(仍在请求/解析数据),我会在高级搜索页面上放置一个带有微调器的alertview。我能够让它工作,我有取消按钮将用户带回上一页,以防他们不想等待。但是如果标志变为true(意味着解析完成),我还需要解除警报,这就是我开始遇到麻烦的地方。我开始一个无限循环来继续检查标志是否为真,然后在它突然出现时解除警报。我把它放在一个单独的线程中,所以循环不会阻止用户点击取消按钮,但是我遇到了各种各样的运行时错误:

  

- [UIAlertView dismissWithClickedButtonIndex:animated:]:已发送消息   解除分配实例0x105330

以下是相关代码:

-(void)viewDidAppear:(BOOL)animated
{
    [NSThread detachNewThreadSelector:@selector(waitTilDone) toTarget:self withObject:nil];
}

-(void)waitTilDone{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    while (mainDelegate.artistDone == @"no" || mainDelegate.mediumDone == @"no" || mainDelegate.seriesDone == @"no" || mainDelegate.areaDone == @"no") {
    }
    [av dismissWithClickedButtonIndex:0 animated:YES];
    [pool release];
}

-(void)viewDidLoad 
{    
    mainDelegate = (PublicArtOmahaAppDelegate*)[[UIApplication sharedApplication]delegate];

    if (mainDelegate.artistDone == @"no" || mainDelegate.mediumDone == @"no" || mainDelegate.seriesDone == @"no" || mainDelegate.areaDone == @"no") {
         av=[[UIAlertView alloc] initWithTitle:@"Loading Form Data" message:@"\n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
        UIActivityIndicatorView *ActInd=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
        [ActInd startAnimating];
        [ActInd setFrame:CGRectMake(125, 40, 37, 37)];
        [av addSubview:ActInd];
        [av show];
        [av release];
        }
    [super viewDidLoad];
}

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    // the user clicked on the Cancel button
    [self dismissModalViewControllerAnimated:YES];
}

所以我的问题是:

  1. 无限循环是一种糟糕的方式来检查我是否可以解雇它?我需要以某种方式做到......:/

  2. 显然我在这里管理的记忆很差,但我对此很陌生,所以我不知道我做错了什么。那里有快速解决方法吗?

1 个答案:

答案 0 :(得分:1)

1):是的,这很疯狂。使用键/值观察(KVO),[NSNotificationCenter defaultCenter],编写您自己的委托或其他内容,以便在值实际更改时收到通知,而不是轮询它。

对于2):在完成之前不要释放它。属性在这里很有帮助,因为它简化了很多事情。

// In header
@property (nonatomic, retain) UIAlertView *av;

// When showing it
self.av = [[[UIAlertView alloc] initWith....] autorelease];
...

// When dismissing it
[self.av dismiss];
self.av = nil;