所以我有一个方法A,它基本上检查UISwitch的当前状态,然后通过text-SMS服务API提醒用户。然而;因为它不断检查引脚的状态我不希望它发送文本50000次(垃圾短信服务);此方法中的最后一个FOR循环是检查它是否应该检查用户的那个;但是当它处于当前状态时,它会在应用程序运行时不断发送。
如果您需要更多说明,请致谢。
方法A:
- (void)setInput:(NCDigitalInput *)input
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *baseString;
uint8_t value = input.value;
self.inputLabel.text = [NSString stringWithFormat:@"0x%0.2X",value];
for (UISwitch *temp in switchArrayIn)
{
temp.on = (value & 1);
value >>= 1;
}
for(int i = 0; i<switchArrayIn.count; i++){
if(![defaults boolForKey:[NSString stringWithFormat:@"digitalInput%dRecentlyAlerted",i]] && ([[switchArrayIn objectAtIndex:i] isOn]) && ([defaults boolForKey:[NSString stringWithFormat:@"digitalInput%dBool",i]]) && ([defaults boolForKey:[NSString stringWithFormat:@"digitalInputAlertOn%dBool",i]])){
[defaults setBool:TRUE forKey:@"digitalInput%dRecentlyAlerted"];
baseString = [defaults objectForKey:@"digitalInput%d"];
NSString *stringSMS = [baseString stringByAppendingString:@" has turned on"];
[self digitalSMSCheck:i :stringSMS];
}
if(![defaults boolForKey:[NSString stringWithFormat:@"digitalInput%dRecentlyAlerted",i]] && !([[switchArrayIn objectAtIndex:i] isOn]) && ([defaults boolForKey:[NSString stringWithFormat:@"digitalInput%dBool",i]]) && ([defaults boolForKey:[NSString stringWithFormat:@"digitalInputAlertOff%dBool",i]])){
[defaults setBool:TRUE forKey:@"digitalInput%dRecentlyAlerted"];
baseString = [defaults objectForKey:@"digitalInput%d"];
NSString *stringSMS = [baseString stringByAppendingString:@" has turned off"];
[self digitalSMSCheck:i :stringSMS];
}
}}
答案 0 :(得分:3)
更改您的设计。轮询很糟糕,没有必要。
将IBActions附加到每个开关。
使交换机的操作方法设置属性。如果你有很多开关,你可以在每个开关上放置标签,并有一个处理所有开关的方法。
然后,您可以在属性上创建自定义setter,也可以使用键值观察来监视主机属性的更改。请查看Xcode文档中的“键值观察编程指南简介”,了解其工作原理。
哪种方法更好取决于您的应用程序的详细信息,以及您的个人品味。 KVC比其他方法慢一点,但效果很好。