【问题标题】:UISwitch latency between taps caused by FirebaseFirebase 导致的点击之间的 UISwitch 延迟
【发布时间】:2014-06-13 23:31:57
【问题描述】:

我有一堆 UISwitch 的视图。

我的问题是,当我点击一个开关时,我需要等待大约 10 秒才能点击视图的任何其他开关。

这是我的代码:

-(void) didTapSwitch:(UISwitch *)sender
{
    NSLog(@"BEGIN didTapSwitch, %@",sender);
    DADudesManager *dudesManager = [DADudesManager getInstance];
    DADude *updatedDude = [dudesManager.dudesList objectAtIndex:[[self.spendingDudesTableView indexPathForCell:sender.superview.superview] row]];
    DAAccountManager *accountManager = [DAAccountManager getInstance];
    [accountManager.accountsOperationQueue addOperationWithBlock:^{
        NSLog(@"BACKGROUND OPERATION BEGINS switchDudeBeneficiates, %@",sender);
        DASpendingsManager *spendingsManager = [DASpendingsManager getInstance];
        [[spendingsManager.spendingObserver childByAppendingPath:self.spending.spendingID] updateChildValues:@{updatedDude.dudeName: [sender isOn] ? @"1" : @"0"}];
        NSLog(@"BACKGROUND OPERATION ENDS switchDudeBeneficiates, %@",sender);
    }];
    NSLog(@"END switchDudeBeneficiates, %@",sender);
}

我的spendingObserver是之前发起的一个Firebase对象。

执行上述代码时,NSLogs 几乎会立即显示在控制台中,同时在线更新数据,但开关在接下来的 9 到 11 秒内对任何点击都没有反应。

当然,注释[[spendingsManager.spendingObserver childByAppendingPath:self.spending.spendingID] updateChildValues:@{weakDude.dudeName: [weakSwitch isOn] ? @"1" : @"0"}]; 行会消除延迟,所以问题一定来自 Firebase,但我不知道发生了什么。

我可能缺少一些明显的东西,因为我对 IOS 开发还很陌生!

【问题讨论】:

  • 这里没有足够的代码来重现错误。这将 Firebase 称为问题,但我看不到有关如何使用 Firebase 的足够上下文来了解它的使用位置和方式。可能需要一个简单的复制来提供帮助。

标签: ios objective-c uiswitch


【解决方案1】:

我可以想到几个原因。

  1. 您正在主线程中发送 PayLoad,这导致用户接口事件被挂起。

  2. 您运行的代码可能链接到您正在使用的库中的其他函数,这可能会导致延迟。

尝试-> 尝试将您的代码放入 NSOperation 并执行它。或者使用 GCD 在不同的线程上工作,而不是作为主要线程的 UI 线程。

【讨论】:

  • 您好,谢谢您的回答。刚刚用不同线程的GCD试了一下,结果完全一样。
  • 我想到了链接问题,并试图将我的变量 sender updatedDude 的弱引用放在块中,但它没有做任何事情
【解决方案2】:

退后一步,简化。让您的开关代码只需记录值的变化。 NSLog 包含一个时间戳,因此您可以知道切换事件何时发生。

如果什么都不做的代码响应很快,我怀疑它会,然后在你的 switch 操作方法的开头和结尾添加日志语句。这样您就可以查看处理开始和结束之间是否存在延迟。

您还可以在仪器(时间分析器)中运行该应用,并查看您的应用在哪里花费时间。

【讨论】:

  • 谢谢。就像我在我的问题中所说的那样,日志清楚地表明该功能表明它在点击开关后几乎立即完成。因此该功能似乎足够快,并且从日志来看,滞后并非来自功能。但当然,滞后来自函数,因为当我注释掉调用 Firebase 的行时,一切都按预期工作。这个 Firebase 必须阻止某些东西,但我不知道是什么。
猜你喜欢
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2017-05-19
相关资源
最近更新 更多