以下是我遇到问题的一段代码:
-(IBAction) nextRegister {
[DSBezelActivityView newActivityViewForView:self.view.superview];
previousPosition = (NSInteger *) currentPosition;
currentPosition = (NSInteger *) ((int)currentPosition + (int) 1 );
[currentRegistry updateOnServer];
[self loadNewRegisterInfos];
[DSBezelActivityView removeViewAnimated:YES];
}
逐行,这是此代码段(或应该执行)的内容:
显示DSBezelActivityView(来自:http://www.dejal.com/developer/dsactivityview)
上一个位置接收实际位置(因为这将移至下一个位置)
接下来是当前+ 1;
更新服务器中的记录(这需要约1秒)
在屏幕上加载新记录和渲染(这需要1~3s,顶部)
此行删除DSBezelActivityView。
因此,当我点击按钮加载下一条记录时,它应该显示ActivityView,加载数据,然后更新屏幕并释放ActivityView。 但是会发生的事情是:它将应用程序冻结3秒,在不到一秒的时间内显示和解散活动视图,然后完成例程。 有什么问题?
将帖子 解决!这是一个线程问题。 分为4种方法:
-(IBAction) nextRegister {
[NSThread detachNewThreadSelector:@selector(openActivityView) toTarget:self withObject:nil];
[self viewNextRegister];
[self removeView];
}
-(void)viewNextRegister{
previousPosition = (NSInteger *) currentPosition;
currentPosition = (NSInteger *) ((int)currentPosition + (int) 1 );
[currentRegister setScoreOnServer];
// [NSThread detachNewThreadSelector:@selector(loadRegisterInfo) toTarget:self withObject:nil];
[self loadRegisterInfo];
}
-(void)openActivityView{
[DSBezelActivityView newActivityViewForView:self.view.superview];
}
-(void)removeView {
[DSBezelActivityView removeViewAnimated:YES];
}
答案 0 :(得分:2)
如果你不小心,你可以这样做,而不是一个可能导致问题的单独线程:
-(void) doNextRegister {
previousPosition = (NSInteger *) currentPosition;
currentPosition = (NSInteger *) ((int)currentPosition + (int) 1 );
[currentRegistry updateOnServer];
[self loadNewRegisterInfos];
[DSBezelActivityView removeViewAnimated:YES];
}
-(IBAction) nextRegister {
[DSBezelActivityView newActivityViewForView:self.view.superview];
[self performSelector:@selector(doNextRegister) withObject:nil afterDelay:0.0];
}