【问题标题】:How to prevent this method from calling too often while it runs [closed]如何防止此方法在运行时调用过于频繁[关闭]
【发布时间】:2014-02-14 16:48:32
【问题描述】:

所以我有一个方法 A,它基本上检查 UISwitches 的当前状态,然后通过文本短信服务 API 提醒用户。然而;因为它一直在检查引脚的状态,所以我不希望它发送 50000 次文本(向 SMS 服务发送垃圾邮件);此方法中的最后一个 FOR 循环是检查是否应该检查用户的循环;但是,就其当前状态而言,每当应用程序运行时,它都会不断发送垃圾邮件。

谢谢,如果您需要更多说明,请询问。

方法一:

- (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];
            }
        }}

【问题讨论】:

  • 难道你不能有一个在 UISwitch 的值发生变化时调用的方法,而不是在循环中检查每个 UISwitch 吗?
  • 这基本上是一种故障保护,它会在开关自行关闭时提醒用户(根据应用程序的用途,这种情况会发生)。
  • 不清楚为什么您无法检测到开关的变化。这一切都发生在您的应用程序中,对吗?改变开关的是用户事件或您的代码。

标签: ios objective-c sms twilio multiple-conditions


【解决方案1】:

改变你的设计。轮询很糟糕,而且没有必要。

将 IBAction 附加到每个交换机。

使开关的动作方法设置属性。如果您有很多开关,您可以在每个开关上放置标签,并使用一个方法来处理所有开关。

然后,您可以在属性上创建自定义设置器,或使用键值观察来观察主机属性的变化。请查看 Xcode 文档中的“Key-Value Observing Programming Guide 简介”,了解其工作原理。

哪种方法更好取决于您的应用程序细节以及您的个人品味。 KVC 比其他方法慢一点,但效果很好。

【讨论】:

  • 我已经按照我的代码所暗示的方式实现了 KVC;但是我需要轮询(除非有另一种方式)开关,因为它正在侦听非用户更改,这可能会根据应用程序的目的发生。如果确实发生了非用户更改,轮询不是唯一的判断方法吗?
  • 不清楚你的意思。什么是“非用户变化”,什么是变化?您是否有可能由于网络事件、硬件设备的输入或其他原因而改变的状态变量?另外,您说“我已经按照我的代码所暗示的方式实现了 KVC……”什么代码?你还没有发布任何代码。您需要对您正在尝试做的事情提供更清晰的解释,以及对您使用的术语的解释。 “……它一直在检查引脚的状态……” 什么引脚?这些是什么?在没有用户交互的情况下,“引脚”如何变化?
  • 非用户更改是由将值读入 ipod 的外部设备所做的更改;如果该设备发生故障,就会发生变化。 IE。;用户打开 UISwitch 0,它从硬件方面发生故障,并告诉开关关闭并提醒用户它已失败......失败可能由各种与硬件相关的问题引起。跨度>
  • 好的,“硬件端”如何与 iOS 设备以及您的应用程序交互?仍然没有足够的信息。
  • 通过闪电电缆连接到与定制框架交互的应用程序与硬件交互。它只是工厂系统的控制板。例如,硬件出现故障,这意味着通过各个焊点连接到硬件的电路板将停止在其各自的端口接收电压。然后这些端口告诉硬件告诉 iPod 哪个告诉应用程序它失败了哪个发送和 SMS 给用户硬件已经失败。
猜你喜欢
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多