DSBezelActivityView无法正常工作

时间:2011-05-17 23:40:38

标签: iphone objective-c multithreading uiactivityindicatorview

以下是我遇到问题的一段代码:

-(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];    
}

1 个答案:

答案 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];
}