2

所以我想这样做:

switch (keyPath) {
    case @"refreshCount":
        //do stuff
    case @"timesLaunched":
       //do other stuff
}

但显然你只能使用整数作为开关量。这样做的唯一方法是将字符串解析为整数标识符然后运行 ​​switch 语句吗?

像这样:

nsinteger num = nil;

if (keyPath isEqual:@"refreshCount") {

num = 0

}

if (keyPath isEqual:@"timesLaunched") {

num = 1

}

我正在尝试优化此代码以使其尽可能快,因为它会经常被调用。

谢谢,

缺口

注意:是的,我正在使用 KVO,所以我在“回调”中接收到一个字符串。

注意 #2:所以让我首先考虑 switch 语句的是我的原始代码实现是这样的:

if ([keyPath isEqual:@"refreshCount"] && ([[change valueForKey:@"new"] intValue] == 10)) { //  
NSLog(@"achievemnt hit inside");
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"Achievement Unlocked!" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:nil];
    [alert show];

我想用相同的方法用不同的 XX 值做一堆这些:

if ([keyPath isEqual:@"refreshCount"] && ([[change valueForKey:@"new"] intValue] == 10)) {

//unlock small achievement

}
 if ([keyPath isEqual:@"refreshCount"] && ([[change valueForKey:@"new"] intValue] == 50))   {

//unlock bigger achievement

}   

//etc

这对我来说似乎效率很低,但也许我错了。

4

3 回答 3

6

也就是说,要使强制转换语句起作用,它isEqualToString:无论如何都必须调用并且会像你想象的那样慢,但可能不会像你想象的那么慢。

当然,第一个问题是您是否测量了性能,是否有证据表明代码导致了性能问题?

如果没有,请完成您的应用程序。运输应用程序始终优于仍在开发中的应用程序!

我敢打赌你没有性能问题;如果您的所有字符串确实是@"refreshCount"与键值观察相关的内联字符串常量(等等),那么它们很可能都是编译到应用程序中的常量字符串,因此比较会非常快,因为每次你提到"@refreshCount"它确实是同一个地址的同一个字符串(比较非常快)。

如果您确实有可量化的性能问题,请在另一个问题中发布详细信息,有人可以具体回答。事实上,除了推测之外,没有足够的架构或定量信息来做任何事情。

于 2010-05-25T17:40:53.960 回答
4

为什么不只使用枚举?

typedef enum _KeyPath
{
     KeyPathNone,
     KeyPathRefreshCount,
     KeyPathTimesLaunched,
     KeyPathCount
} KeyPath;

如果您必须使用应该与之比较的字符串isEqualToString:

从 NSString 文档:

Special Considerations
When you know both objects are strings, this method is a faster way to check equality than isEqual:.
于 2010-05-25T17:38:58.683 回答
2

简短的回答是首先不要使用字符串。除此之外,您可以让字符串成为具有整数 (NSNumber) 值的字典中的键。或者您可以使用字符串的哈希值。

switch ( [keyPath myQuickHash] ) {
case kHashRefreshCount:
case kHashTimesLaunched:
}

如果只有几个不同的字符串,您可以使用前(或最后)4 个字符作为字符串文字并考虑哈希。

switch ( [keyPath stringLiteral] ) {
case 'refr':
case 'time':
}

编辑:

switch 语句本质上是一个稀疏的代码片段数组。哈希表是一种在给定任意值的稀疏数组中查找索引的方法。给定一组已知的字符串输入,switch 语句可以像哈希表一样操作,也就是说,具有恒定的查找时间。您所要做的就是为已知输入选择一个没有冲突的哈希算法。如果不知道输入集,这不是一个选项,但在这个问题中,所有输入都可能是已知的。

这与 Apple 如何实现其哈希算法完全无关,因为您必须实现自己的哈希算法。选择的算法可能就像将字符串中的长度和字母相加一样简单。

于 2010-05-25T17:40:00.577 回答