在我的应用程序中,我有一个高级搜索页面,它使用带有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];
}
所以我的问题是:
无限循环是一种糟糕的方式来检查我是否可以解雇它?我需要以某种方式做到......:/
显然我在这里管理的记忆很差,但我对此很陌生,所以我不知道我做错了什么。那里有快速解决方法吗?
答案 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;