Firebase导致的点击之间的UISwitch延迟

时间:2014-06-13 23:31:58

标签: ios objective-c uiswitch

我有一堆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对象。

当执行上面的代码时,NSLog几乎立即显示在控制台中,数据同时在线更新,但开关不再对任何一个水龙头做出反应,持续9到11秒。

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

我可能错过了一些显而易见的事情,因为我对IOS开发还很陌生!

2 个答案:

答案 0 :(得分:0)

我可以想到几个原因。

  1. 您正在主线程中发送PayLoad,导致用户INTERface事件被暂停。

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

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

答案 1 :(得分:0)

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

如果do-nothing代码快速响应,我怀疑它会响应,然后在switch action方法的开头和结尾添加日志语句。这样你就可以看到处理的开始和结束之间是否有延迟。

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