查看层次结构刷新时间

时间:2009-11-15 01:43:01

标签: iphone cocoa uiview

我正在尝试将一个进度表或其他“我现在正忙”的通知添加到我的视图层次结构中,然后再进行一些阻止UI的强烈计算。我的代码看起来像:

//create view
[currentTopView addSubView:imBusyView];

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

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

如何立即显示视图?

2 个答案:

答案 0 :(得分:3)

仅当代码将控制权返回到运行循环时才会进行重绘。因此,最简单的方法是使用零延迟来安排startComputing调用。这样,它将在下一次运行循环迭代期间(重绘后立即执行)执行:

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

请注意,除非您在另一个线程中进行计算,否则您将无法在计算过程中更新UI。

答案 1 :(得分: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”的主线程方法,并释放线程autorelease池。

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

您可以使用我编写的小型activityIndi​​cator类:

-(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上尤其重要。