慢的iOS字符串操作......为什么?

时间:2014-03-13 23:32:33

标签: ios objective-c nsstring uitextfield

我有四个文本字段,我需要创建一个“名称”,如下所示:

firsname lastname和otherfirstname otherlastname(即Barbara Smith和John Jameson)

但如果缺少任何部分,则需要将其与分隔空间和/或分离“和”分开,以便它最终可以“芭芭拉和约翰”或“约翰詹姆森”或“史密斯”和Jameson'或这四个领域的任何组合都存在。

我调用一个方法从textFieldShouldEndEditing创建这个新名称字符串,如果它是执行回调的这四个字段之一。然后我使用自己的协议方法通过委托回调设置应用程序标题(由于我的视图控制器嵌套)。

这一切都很有效,除了由于某种原因,在这四个字段之间点击非常慢。

在我的视图中点击任何其他文本字段要快得多。我怀疑这是我的名字字符串生成方法。

这是我的textFieldShouldEndEding回调:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
// set the event title if the client name fields have been edited
if ((textField == self.CPNameFirst) || (textField == self.CPNameLast) || (textField == self.CSNameFirst) || (textField == self.CSNameLast)) {
    if (self.CPNameFirst.text.length == 0 && self.CPNameLast.text.length == 0 && self.CSNameFirst.text.length == 0 && self.CSNameLast.text.length == 0) {
        // the user has just erased all data that could make up the event name automatically
        self.theEvent.name = @"New Client";
    } else {
        // set the event name using the client names
        self.theEvent.name = [self generateAutomaticEventName];
    }
    [self.delegate changeAppTitle:self.theEvent.name];
}
return YES;
}

生成名称字符串的方法:

- (NSString *)generateAutomaticEventName {
NSString *theName = [[NSString alloc] init];
NSString *CPPart = [[NSString alloc] init];
NSString *CSPart = [[NSString alloc] init];

// generate the primary client part
if ((self.CPNameFirst.text.length == 0) && !(self.CPNameLast.text.length == 0)) {
    // primary first name is blank so we don't need the leading space
    CPPart = self.CPNameLast.text;
} else if ((self.CPNameLast.text.length == 0) && !(self.CPNameFirst.text.length == 0)) {
    // primary first name is blank so we don't need the trailing space
    CPPart = self.CPNameFirst.text;
} else if ((self.CPNameFirst.text.length == 0) && (self.CPNameLast.text.length == 0)) {
    // both are blank
    CPPart = @"";
} else {
    // neither are blank
    CPPart = [NSString stringWithFormat:@"%@ %@", self.CPNameFirst.text, self.CPNameLast.text];
}

// generate the secondary client part
if ((self.CSNameFirst.text.length == 0) && !(self.CSNameLast.text.length == 0)) {
    // secondary first name is blank so we don't need the leading space
    CSPart = self.CSNameLast.text;
} else if ((self.CSNameLast.text.length == 0) && !(self.CSNameFirst.text.length == 0)) {
    // secondary first name is blank so we don't need the trailing space
    CSPart = self.CSNameFirst.text;
} else if ((self.CSNameFirst.text.length == 0) && (self.CSNameLast.text.length == 0)) {
    // both are blank
    CSPart = @"";
} else {
    // neither are blank
    CSPart = [NSString stringWithFormat:@"%@ %@", self.CSNameFirst.text, self.CSNameLast.text];
}

// combine the two parts into the final name
if ((CSPart.length == 0) && !(CPPart.length == 0)) {
    // no secondary client names entered
    theName = CPPart;
} else if ((CPPart.length == 0) && !(CSPart.length == 0)) {
    // no primary client names entered
    theName = CSPart;
} else if ((CPPart.length == 0) && (CSPart.length == 0)) {
    // both are blank
    theName = @"New Client";
} else {
    theName = [NSString stringWithFormat:@"%@ and %@", CPPart, CSPart];
}

return theName;
}

有没有更好的方法呢?

可能是导致经济放缓的其他原因吗? (这不是设置应用程序标题的委托回调......我已经测试过了。)

3 个答案:

答案 0 :(得分:1)

作为提及者之一,乐器是您的朋友。您可以通过在Xcode的“产品”菜单下选择“配置文件”,使用Instruments运行您的应用程序。使用Time Profiler模板。

一些明显的问题只是看了你的代码:

  • 不要分配/初始化CPPart和CSPart。您将在稍后分配它们。 (公约称这些局部变量应该从小写开始。)
  • 您计算每个文本字段的长度3次。只需执行一次并存储在本地变量中。

我的猜测就像其他人一样只是猜测。使用仪器进行分析将告诉您确切的时间花在哪里。

答案 1 :(得分:0)

您的代码看起来很好,但无论如何这只是一点优化。

NSArray *array = [NSArray arrayWithObjects:self.CPNameFirst.text, ... all your inputs..., nil];
NSMutableString *str = [[NSMutableString alloc] init];
for (NSString *s in array)
{
    if (s.length>0)
    {
        if (str.length>0)
            [str appendString:@" "];
        [str appendString:s];
    }
}
if (!str.length)
    str = @"new client";
return str;

(可能存在一些语法错误,因为我没有对此进行测试。)

答案 2 :(得分:0)

我无法解决这个问题。我清理了很多代码,当从textFieldShouldEndEditing调用时,它的执行速度仍然非常慢。

我把呼叫放在textFieldShouldReturnkeyboardWillBeHidden中,而现在它的速度要快得多(虽然只有在键盘关闭或点击Return时才执行)。

感谢所有人的帮助!