繁体   English   中英

iOS-像地狱一样缓慢

[英]iOS - blocks slow as hell

我在应用程序的界面上大约有10个对象。 这些对象基本上是一个发光的按钮,显示在给定时间内哪个按钮处于活动状态。 选择一个按钮后,其发光将打开,而所有其他按钮的发光将被关闭。

为了打开和关闭发光,我有这个

[buttons enumerateObjectsWithOptions:NSEnumerationConcurrent
                                     usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (obj == sender)
            [(myButtonClass *)obj showGlow];
    else {
            [(myButtonClass *)obj hideGlow];
    }
}];

但是我被迫改成这个

[buttons enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    if (obj == sender)
            [(myButtonClass *)obj showGlow];
    else {
            [(myButtonClass *)obj hideGlow];
    }
}];

删除枚举的并发部分。 问题在于,特别是对于某些按钮,发光需要5秒钟才能打开或关闭,但始终只对相同的按钮发光。 我的印象是,它们处于一种按顺序处理的队列中(????? !!!)

showGlow / hideGlow方法基本上是两行:设置变量和打开和关闭glow imageView的hidden属性。 因此,这些是所有按钮的快速方法。

我不明白的是为什么问题是针对某些按钮而不是其他按钮发生的,为什么当应用程序基本处于空闲状态时,一个块要花这么长时间来处理。

有什么线索吗? 谢谢。

UI更新“缓慢”的一个原因可能是,当使用NSEnumerationConcurrent选项时,枚举发生在主线程以外的其他线程上。 由于所有UI更新均应在主线程上进行,因此您的UI更改不会立即反映出来,而是会在运行循环刷新所有所做的更改后出现延迟。

在您的情况下,您只有10个对象,使用并发选项是不合理的。 此外,当您仅可以使用易读的代码,或者为什么要进行快速枚举时,为什么要将代码与块复杂化,例如:

for (UIButton *button in buttons) {
    if (button == sender) [button showGlow];
    else [button hideGlow];
}

如果您在某处启动活动指示器,然后在后台线程中将其停止,则可以尝试观察相同的延迟UI更新。 实际停止将需要几秒钟。

如果坚持使用块,则必须在主线程中调用所有UIKit方法:

[buttons enumerateObjectsWithOptions:NSEnumerationConcurrent
                                 usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (obj == sender)
        // One possibility with GCD and dispatch_async on the main queue
        dispatch_async(dispatch_queue_get_main(), ^{[(myButtonClass *)obj showGlow];});
    else {
        // another possibility to call the selector on the main thread
        [(myButtonClass *)obj performSelectorOnMainThread:@selector(hideGlow)];
    }
}];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM