正确处理UIControlEventValueChanged事件

时间:2012-04-20 08:10:33

标签: ios event-handling uikit race-condition uiswitch

我有一个UISwitch,其对应的UIControlEventValueChanged事件绑定到函数[- handleSwitch:]

查看控制器

- (IBAction)handleSwitch:(UISwitch *)sender
{
    static BOOL oldState;

    if (sender.on && !oldState) {
        NSLog(@"off => on");
    } else if (oldState && !sender.on) {
        NSLog(@"on => off");
    } else if (oldState && sender.on) {
        NSLog(@"Big bug source: on => on");
    } else {
        NSLog(@"Big bug source: off => off");
    }
    oldState = sender.on;
}

每隔几秒钟按一次开关,程序运行正常。但是,一旦我开始向交换机发送垃圾邮件,我就会开始获得“大错误来源”。

在调用sender.on函数之前,[- handleSwitch]似乎再次更改为旧值。

  1. 将更改从Off切换为On
  2. 事件“值已更改”已放入队列
  3. 将更改从On切换为Off
  4. 调用
  5. [- handleSwitch:]以响应“值已更改”事件消息。但是,由于交换机已经更改回Off状态,因此在事件发送之前,它无法检测到交换机处于On状态。
  6. [- handleSwitch]没有第二次调用。不知何故,两个“价值变化”事件合并为一个。
  7. 这导致了以下问题:

    • 这种情况如何处理?是否真的有必要手动处理从UISwitch状态到同一状态的转换?

    • 该框架足够智能,可将两个交换机转换组合成一个事件。为什么它不够智能来检测On => OnOff => Off个案例并在这些情况下从队列中删除事件?

    • [- handleSwitch]功能期间,切换值是否可能会改变?或者是在GUI线程上调用的函数,因此,在运行时阻止用户界面?

      如果在方法中值可能会发生变化,那么如何应对呢?由于该方法仅获取指向UISwitch本身作为参数的指针,因此在创建事件时无法获取其值。只能检索当前值,该值可能已经更改。

0 个答案:

没有答案