如何在目标c中按顺序执行语句

时间:2013-10-29 15:45:22

标签: ios objective-c

当我点击我的按钮时,我的功能被称为

[myBtn addTarget:self action:@selector(myFunction) forControlEvents:UIControlEventTouchUpInside];

在我的函数中,将执行一个复杂语句的集合并花费一点点时间来运行,所以我想显示Loading(UIActivityIndi​​catorView)如下:

-(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]时,这是不寻常的, - >它的工作非常好,我的意思是所有的陈述都按顺序执行。

我只想点击我的按钮,立即调用加载。

事先提前

3 个答案:

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

}