2009-11-15 97 views
1

我正在尝试将一个进度表或其他“我现在正忙”通知添加到我的视图层次结构中,然后再执行一些会阻止用户界面的激烈计算。我的代码看起来像这样:视图层次结构刷新时机

//create view 
[currentTopView addSubView:imBusyView]; 

//some initialization for the intense computation 
[computation startComputing]; 

不幸的是,我的进度计直到计算完成后才显示。它看起来像视图不会重新绘制,直到运行循环完成。我很确定setNeedsDisplay和setNeedsLayout也将等到运行循环完成。

如何让视图立即显示?

回答

3

只有在代码将控制权返回给运行循环时才会进行重绘。因此,最简单的方法是让您安排零延迟的startComputing调用。

[computation performSelector:@selector(startComputing) withObject:nil afterDelay:0.0]; 

要知道,不过,除非你在另一个线程做你的计算,你将无法在更新UI:这样的话,它将在接下来的运行循环迭代(重绘后右)期间执行计算。

+0

这帮助我解决了一个完全不相关的问题。谢谢! – 2011-03-15 23:34:28

1

如果你正在做繁重的计算,可能产生一个新的线程是一个好主意。

在这里,我有一个activityIndi​​cator显示,并在后台线程开始大XMLPARSE操作:

- (void) setSearchParser { 
activityIndicator = [[ActivityIndicatorView alloc] initWithActivity]; 
[self.view addSubview:activityIndicator]; 
[NSThread detachNewThreadSelector:@selector(getSearchResults:) toTarget:self withObject:[searchParser retain]]; 
} 

那么getSearchResults方法:

- (void) getSearchResults: (SearchResultParser *) parser { 
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
[parser startParser]; 
[self performSelectorOnMainThread:@selector(searchResultsReady:) withObject:[parser data] waitUntilDone:NO]; 
[pool release]; 
} 

所以,首先创建一个新的线程:

[NSThread detachNewThreadSelector:@selector(getSearchResults:) toTarget:self withObject:[searchParser retain]]; 

这意味着getSearchResults中的所有代码都将是在另一个线程上执行。 getSearchResults也传递了一个“searchParser”的参数,即一个只需startParse的大对象就可以开始调用它。

这是在getSearchResults中完成的。当[parser startParser]完成时,结果被传回到名为“searchResultsReady”的主线程方法,并释放线程自动释放池。

从我的解析器开始它完成的所有时间,灰色视图覆盖了屏幕上的一个activityIndi​​cator。

你可以有小activityIndi​​cator I类写道:

-(id) initWithActivity { 
[self initWithFrame:[self bounds]]; 
[self setBackgroundColor:[UIColor blackColor]]; 
[self setAlpha:0.8]; 
activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
activityView.center = CGPointMake(160, 240); 
[self addSubview:activityView ]; 
[activityView startAnimating]; 
return self; 
} 

- (void) dealloc { 
[activityView release]; 
[super dealloc]; 
} 

希望它可以帮助你,即使线程似乎有点混乱,他们可以帮助使UI不冻结,这一点特别重要在iPhone上。

+0

谢谢布拉德。 我似乎无法得到客观的C代码格式正确:) – RickiG 2009-11-15 19:14:38

+0

谢谢你的冗长的回应。对于我的情况,用户将期待UI被阻止。 – SooDesuNe 2009-11-19 02:05:20