我有一堆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开发还很陌生!
答案 0 :(得分:0)
我可以想到几个原因。
您正在主线程中发送PayLoad,导致用户INTERface事件被暂停。
您运行的代码可能会链接到您正在使用的库中的其他函数,这可能会导致延迟。
尝试 - > 尝试将您的代码放在NSOperation中并执行它。或者使用GCD在不同的线程上工作,而不是作为主要的thead的UI线程。
答案 1 :(得分:0)
退一步并简化。使您的开关代码只需记录值的变化。 NSLog包含一个时间戳,因此您可以判断切换事件何时发生。
如果do-nothing代码快速响应,我怀疑它会响应,然后在switch action方法的开头和结尾添加日志语句。这样你就可以看到处理的开始和结束之间是否有延迟。
您还可以在乐器(时间分析器)中运行该应用,并查看您的应用花费时间。