当我点击我的按钮时,我的功能被称为
[myBtn addTarget:self action:@selector(myFunction) forControlEvents:UIControlEventTouchUpInside];
在我的函数中,将执行一个复杂语句的集合并花费一点点时间来运行,所以我想显示Loading(UIActivityIndicatorView)如下:
-(void) addTradeAction {
//Show Loading
[SharedAppDelegate showLoading];
//disable user interaction
self.view.userInteractionEnabled = NO;
//execute call webservice in here - may be take 10s
//Hide Loading
[ShareAppDelegate hideLoading];
}
点按myBtn(我的按钮) - >在3s或4s之后,调用了[ShareAppDelegate showLoading]。
当我在其他功能上使用[ShareAppDelegate showLoading]时,这是不寻常的, - >它的工作非常好,我的意思是所有的陈述都按顺序执行。
我只想点击我的按钮,立即调用加载。
事先提前
答案 0 :(得分:2)
在后台执行任务的正确方法是:在显示活动指示符的情况下:
-(void)myBackGroundTask
{
//here showing the 'loading' and blocking interaction if you want so
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//here everything you want to perform in background
dispatch_async(dispatch_get_main_queue(), ^{
//call back to main queue to update user interface
});
});
}
使用这种块,您可以确保您的界面不会冻结,并保持平滑的动画。
答案 1 :(得分:1)
如果您的复杂语句没有任何UI动画或UI相关代码,那么您可以在不同的线程(除了mainThread)中执行该部分。语句完成后(或在完成块中),您可以删除那里的loadingOverlay。
答案 2 :(得分:0)
将myFunction放在后台队列上运行,因为它可能会使系统挂起:
- (void)myFunction {
dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);
// execute a task on that queue asynchronously
dispatch_async(myQueue, ^{
// Put the current myFunction code here.
});
}