-endEditing与条件语句在解除键盘中的性能



在后台敲击键盘时,我通常会在根视图中添加一个敲击手势识别器,并将其连接到dismissKeyboard:IBAction,可以使用以下任一方法实现:

// Method 1
- (IBAction)dismissKeyboard:(id)sender
{
[self.view endEditing:YES];
}

// Method 2
- (IBAction)dismissKeyboard:(id)sender
{
if ([self.firstNameTextField isFirstResponder]) {
[self.firstNameTextField resignFirstResponder];
}
else if ([self.lastNameTextField isFirstResponder]) {
[self.lastNameTextField resignFirstResponder];
}
// And so on for all UITextFields in the view
}

虽然第一种方法很方便,但我很好奇它是否因为性能命中、苹果推荐的最佳实践或其他原因而不太可取。第二个方法虽然很冗长,但只检查显式提供的子视图,并在找到要辞职的文本字段后返回。出于这些原因,它看起来仍然是一个有吸引力的选择。

我今晚进行了一次性能测试,测试这两种辞去第一响应者的方法之间的差异。

对于第一个测试,我分配并初始化了4000个UITextFields,并将它们作为子视图添加到UIViewController的主视图中。然后,我将其中一个UITextFields作为第一个Responder,然后取当前的NSDate。然后我打电话给[self.view endEditing:YES];,取了另一个当前的NSDate。我计算了开始日期和结束日期之间的时间间隔,得到了以秒为单位的差值:0.000029

在第二个测试中,我分配了一个UITextField,并将其设置为第一个响应程序。然后,我执行了相同的NSDate计算,但使用if语句检查UITextField当前是否是第一个响应程序,然后调用-resignFirstResponder(如果它确实是第一个应答程序)。时间差(秒)为:0.000012

这两项测试都是在iPhone 5s的设备上进行的。

所以,我们在这里测量的是主线程被阻塞的时间(这会导致应用程序滞后)。尽管如此,使用-resignFirstResponder测试textField是否为第一响应程序,比在主视图上调用-endEditing:YES仅快0.000017,这还是非常令人惊讶的。然而,这表明,这两种放弃第一响应者状态的方法之间的性能差异实际上可以忽略不计。

我想知道苹果在幕后做什么?

您有没有想过存储第一个响应程序?然后你就辞职了?在那之后你就不需要有条件了。

最新更新