我有一個自定義視圖控制器,實現從UITableViewDataSource
和UITableViewDelegate
協議。當我加載我的表的數據時(在我的viewDidLoad
方法中),我創建了一個NSOperationQueue
和一個NSInvocationOperation
並將其添加到隊列中。我拋出一個活動指示器,並退出viewDidLoad
。NSOperationQueue似乎掛起完成幾秒鐘
用於該操作的方法結束活動指示器動畫。
我注意到,當操作完成時,在操作真正完成之前有5-7秒的暫停,即使通過NSLog它看起來像操作的方法返回。
我試圖用儀器找出停頓在哪裏,但是我無法從中發現,因爲我的大部分CPU時間都花在系統庫中。
編輯 下面是一個簡化版本:
@implementation MyViewController
@synthesize ...
- (void)viewDidLoad {
[super viewDidLoad];
self.opsQueue = [[NSOperationQueue alloc] init];
NSInvocationOperation *aiStartOp = [[[NSInvocationOperation alloc]
initWithTarget:self
selector:@selector(showActivityIndicators)
object:nil] autorelease];
[self.opsQueue addOperation:aiStartOp];
NSInvocationOperation *dataOp = [[[[NSInvicationOperation alloc]
initWithTarget:self
selector:@selector(dataUpdate)
object:nil] autorelease];
[dataOp addDependency aiStartOp];
[self.opsQueue addOperation:dataOp];
NSInvicationOperation *aiStopOp = [[[NSInvicationOperation alloc]
initWithTarget:self
selector:@selector(hideActivityIndicators)
object:nil] autorelease];
[aiStopOp addDependency:dataOp];
[self.opsQueue addOperation:aiStopOp];
}
/* other stuff */
@end
只要是明確的,在隊列中的最後一個操作是這樣的:
- (void)hideActivityIndicators {
DLog(@"hiding activity indicator");
self.portraitChartProgressView.hidden = YES;
[self.portraitChartProgressIndicator stopAnimating];
self.landscapeProgressView.hidden = NO;
[self.landscapeProgressIndicator startAnimating];
}
我在日誌中看到的是輸出上面的日誌消息,然後是5秒的暫停,然後最後是隱藏指示器的視圖。
任何想法?
您是否在主線程上調用hideActivityIndicators? – falconcreek 2010-06-30 18:33:59
@falconcreek:no;我是不是該? (請參閱編輯以更好地瞭解正在發生的事情) – 2010-06-30 18:39:52