【问题标题】:UIKit Issue - setting color on a IBOutlet item taking a lot of timeUIKit 问题 - 在 IBOutlet 项目上设置颜色需要很长时间
【发布时间】:2014-05-15 14:48:46
【问题描述】:

我有一个奇怪的问题。

我正在运行以下代码,loginButton 是一个简单的UIViewController 中的IBOutlet UIButton

-(void)updateLayout{

   NSDate *startColor = [NSDate date];
   loginButton.backgroundColor = UIColorFromRGB([MSThemeManager getCoreColor]);
   pageControl.backgroundColor =UIColorFromRGB([MSThemeManager getCoreColor]);
   NSDate *methodFinishColor = [NSDate date];
   NSTimeInterval executionTimeColor = [methodFinishColor timeIntervalSinceDate:startColor];
   NSLog(@"Execution Time for getColorMethod: %f", executionTimeColor);
}

日志中提供的执行时间是非常正确的,所以getColorMethod没有问题,它也在很多不同的地方使用,没有任何问题:

2014-05-15 16:40:28.570 TnMC[9642:4007] Execution Time for getColorMethod: 0.000132

但具体而言,loginButtonpageControl 上的颜色更新很容易需要 10 到 20 秒,并且不会出现任何褪色。

注意:
- loginButton 上与颜色无关的其他 UI 更新(例如更改 titleLabel.text)在同一方法中是即时的
- 应用程序中没有同时进行其他处理
- 这一切都在主线程上,并且由于通知而调用updateLayout

   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateLayout) name:nAppUpdateLayout object:nil];

有什么想法吗?

【问题讨论】:

  • 确保您在主线程上调用代码。代码可能在 bg 线程上执行。此外,如果您使用 NSNotifications,请确保将它们发布在主线程上。
  • 你好 danypata,在 dispatch_get_main_queue() 上调度成功了!谢谢 。没有意识到 NSURLDataSessionTask 作为默认行为在主线程上执行处理。如果你想让我选择你作为一个好的回应,你可以回答。
  • 你好@Romain Dorange :))

标签: ios objective-c uikit uicolor iboutlet


【解决方案1】:

让我详细说明一下这种问题,我相信许多其他正在学习 iOS 的开发人员都遇到或将遇到。

基本上,每当您进行一些基本的 UI 更改(如背景颜色、文本颜色等)或其他不需要大量计算且 UI 未更新的 UI 更改时,您必须首先检查两件事(除了更改 UI 的代码的正确性)。

  1. 当您尝试更新/更改某些内容时,您的 UI 是否冻结?

  2. 如果您的 UI 没有冻结,它是否会更新,或者代码是否已执行?

如果发生第一点,显然你在主线程上做了很多工作,你必须将繁重的工作转移到后台线程上。

如果发生第二点,则可能有两个原因。首先,您的代码是错误的,它从未被调用过,或者代码是在后台线程上调用的。

为了确定您的代码是否在后台线程上执行,只需在要更新代码的位置放置一个断点并检查调试导航器以查看线程号,如果它不是主线程,则将其置于主线程.

第二种确定你的代码是否在后台线程上的方法是......惊喜......一个丑陋的崩溃。

在后台执行的 UI 代码还有一个非常讨厌的问题是使用 NSNotification 来更新 UI。经验法则:NSNotification 与调用者发布在同一线程上。

【讨论】:

  • 完美答案,就是这样。
猜你喜欢
  • 2012-11-27
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多