我正在尝试将一个进度表或其他“我现在正忙”的通知添加到我的视图层次结构中,然后再进行一些阻止UI的强烈计算。我的代码看起来像:
//create view
[currentTopView addSubView:imBusyView];
//some initialization for the intense computation
[computation startComputing];
不幸的是,直到计算完成后才会显示我的进度表。看起来在运行循环完成之前不会重新绘制视图。我很确定setNeedsDisplay和setNeedsLayout也会等到运行循环完成。
如何立即显示视图?
答案 0 :(得分:3)
仅当代码将控制权返回到运行循环时才会进行重绘。因此,最简单的方法是使用零延迟来安排startComputing调用。这样,它将在下一次运行循环迭代期间(重绘后立即执行)执行:
[computation performSelector:@selector(startComputing) withObject:nil afterDelay:0.0];
请注意,除非您在另一个线程中进行计算,否则您将无法在计算过程中更新UI。
答案 1 :(得分:1)
如果你正在进行繁重的计算,那么产生一个新线程是一个好主意。
这里我显示了一个activityIndicator并在后台线程中启动一个大型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”的主线程方法,并释放线程autorelease池。
从我的解析器开始到它已经完成所有时间,一个灰色的视图覆盖了屏幕上的一个activityIndicator。
您可以使用我编写的小型activityIndicator类:
-(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上尤其重要。