2

嗨,我在我的应用程序中使用 SQllite。我想在 db 进程开始和结束期间显示活动指示器。

这是我的代码:

[activityIndicator startAnimating];
// DB Open

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

当我尝试这个时,它不能正常工作。sqllite 代码是否会阻止指示器的动画?我在滚动视图中使用活动指示器。

4

3 回答 3

3

试试下面的代码:

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

创建数据库处理方法

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

}
于 2012-06-01T06:07:52.857 回答
3

关于它为什么不起作用的解释很简单:UI 仅在当前运行循环终止后更新。运行循环包含您在单个线程(当前是应用程序的主线程)中进行的所有调用。

因此,例如,如果您调用类似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 参考。

于 2012-06-01T06:32:15.627 回答
0

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

[activityIndicator startAnimating];

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

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

它会起作用的。

于 2012-06-01T06:02:01.557 回答