iphone - 事件指示器无法正常工作

标签 iphone objective-c uiactivityindicatorview

您好,我在我的应用程序中使用 SQllite。因为我想在数据库进程启动和结束时显示事件指示器。

这是我的代码:

[activityIndicator startAnimating];
// DB Open

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

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

最佳答案

关于它为什么不起作用的解释很简单: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];
}

如果您想了解技术内容,请查看 Thread 编程指南或 NSRunloop 引用。

关于iphone - 事件指示器无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10845116/

相关文章:

iphone - 在 UITableView 页脚中放置一个按钮,并使 UITableViewCell 不在页脚下方

iphone - EXC_BAD_ACCESS 带有 characterAtIndex,但不是 substringToIndex

iphone - Objective-C 类别的问题

ios - 使用自动布局的 UIImage 旁边的 UILabel

iphone - 如何转储存储在 Objective-C 对象(NSArray 或 NSDictionary)中的数据

ios - 使用新项目 iOS 上传新版本的应用程序

iphone - 在 iOS 的 UIView 上加载时如何为 UIActivityIndi​​cator 设置灰色背景

iphone - UIWebView 超时 由于互联网不可用而出现问题?

xcode - 按钮上方的事件指示器会阻止点击识别

iphone - 如何在 Windows 上从提取的 ipa 包中提取 "uncrush"PNG? [png粉碎]