活动指标无法正常工作

时间:2012-06-01 05:55:49

标签: iphone objective-c uiactivityindicatorview

您好我在我的应用程序中使用SQllite。我希望在db进程开始和结束期间显示活动指示符。

这是我的代码:

[activityIndicator startAnimating];
// DB Open

// DB close
// DB process ends
[activityIndicator stopAnimating];

当我尝试这个时,它无法正常工作。 sqllite代码是否阻止了指标的动画?我在scrollview中使用活动指示器。

3 个答案:

答案 0 :(得分:4)

尝试以下代码:

[[activityIndicator startAnimating];
[self performSelector:@selector(DB_process) withObject:nil afterDelay:0.1];

创建DB流程方法

- (void)DB_process
{
   // DB close
   // DB process ends
   [activityIndicator stopAnimating];

}

答案 1 :(得分:3)

关于它为什么不起作用的解释很简单: UI只在当前runloop终止后才会更新。 runloop包含你在一个线程中进行的所有调用(目前,你的应用程序的主线程。)

因此,例如,如果您调用类似for (int i=1; i<1000; i++) { label.text = i }的内容(粗略的伪代码中),您的标签将不会显示其文本的1000个更改,它将仅显示最终值。

这是由UIKit以这种方式完成的,因此界面可以流畅且没有锯齿。

如果您确实想要在同一方法中在UI上执行多个更新,则必须在后台线程中执行计算。 其他答案提到使用延迟通话(0.1秒),但这是无用的,如果你反复调用它会产生巨大的滞后,比如说一百次。正确的解决办法就是这样:

- (void)doSomethingVeryLong
{
    [spinner startAnimating];
    // or [SVProgressHud showWithMessage:@"Working"];
    [self performSelectorInBackground:@selector(processStuffInBackground)];
}

- (void)processStuffInBackground
{
    for (int i = 0; i < 1e9; i++)
    {
        /* Make huge computations, 
         * wait for a server, 
         * teach a neurasthenic French (no offence, I'm French)
         */
    }
    [self performSelectorOnMainThread:@selector(workDone)];
}

- (void)workDone
{
    [spinner startAnimating];
    // or [SVProgressHud dismiss];
}

如果你想搞砸技术内容,请查看线程编程指南或NSRunloop参考。

答案 2 :(得分:0)

尝试在延迟几秒后调用流程部分。

[activityIndicator startAnimating];

//在不同方法(DB Open)延迟后调用此部分

// DB close
// DB process ends
[activityIndicator stopAnimating];

它会起作用。