延迟类选择器调用

时间:2014-10-06 19:35:00

标签: ios objective-c selector delay class-method

我正在尝试在延迟上使用args调用类方法,异步地隐藏UILabel。基本上,标签应该出现,然后在三秒钟内消失。我正在使用以下内容来完成此任务。

设置显示视图的主要方法

 +(void)queueError:(UILabel*)messageView errorText:(NSString*)errorText{
        [messageView setText:errorText];
        messageView.hidden = NO;
        messageView.tag = arc4random_uniform(UINT32_MAX);
        [UIView animateWithDuration:0.3 delay:0.0 options:0 animations:^(){
            messageView.alpha = 1.0;
        }completion:^(BOOL finished){
            NSArray* args = [NSArray arrayWithObjects:messageView, [NSNumber numberWithInt:messageView.tag ], nil];
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                [[UBSNavigationUtils class] performSelector:@selector(dequeueErrorTime:) withObject:args afterDelay:3];
            });
        }];
    }

三秒延迟后调用的方法

+(void)dequeueErrorTime:(NSArray*)args{
    UILabel* messageView = args[0];
    NSInteger tag = [((NSNumber*)args[1]) integerValue];
    if(messageView.tag == tag){
        [[UBSNavigationUtils class] fadeOutError:messageView];
    }
}

但是,我的方法永远不会被调用。

2 个答案:

答案 0 :(得分:2)

您将选择器放在dispatch_queue runloop(技术上作为计时器),它没有运行。因此你的方法从未调用。我想,如果你尝试调用[[NSRunLoop currentRunLoop]run];,方法将被调用。

关于performSelector:afterDelay:的苹果讨论 当计时器触发时,线程会尝试将消息从运行循环中出列并执行选择器。如果运行循环正在运行且处于默认模式,它会成功;否则,计时器将等待,直到运行循环处于默认模式。

答案 1 :(得分:1)

不要使用dispatch_async,而应考虑dispatch_after

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  [UBSNavigationUtils dequeueErrorTime:args];
});

修改:我只是想帮助您清理代码。 :(

+(void)queueError:(UILabel*)messageView errorText:(NSString*)errorText{
  [messageView setText:errorText];
  messageView.hidden = NO;
  NSInteger expectedTag = arc4random_uniform(UINT32_MAX);
  messageView.tag = expectedTag;
  [UIView animateWithDuration:0.3 delay:0.0 options:0 animations:^(){
    messageView.alpha = 1.0;
  } completion:^(BOOL finished) {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
      [UBSNavigationUtils dequeueErrorMessage:messageView tag:expectedTag];
    });
  }];
}

+ (void)dequeueErrorMessage:(UILabel *)messageView tag:(NSInteger)tag {
  if(messageView.tag == tag) {
    [[UBSNavigationUtils class] fadeOutError:messageView];
  }
}