Ios 延迟类选择器调用

Ios 延迟类选择器调用,ios,objective-c,selector,delay,class-method,Ios,Objective C,Selector,Delay,Class Method,我试图在延迟上异步调用一个类方法,以隐藏UILabel。基本上,标签应该出现,然后在三秒内消失。我正在使用下面的方法来实现这一点 设置显示视图的主要方法 +(void)queueError:(UILabel*)messageView errorText:(NSString*)errorText{ [messageView setText:errorText]; messageView.hidden = NO; messageView.tag =

我试图在延迟上异步调用一个类方法,以隐藏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];
    }
}

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

您将选择器放在调度队列运行循环中(从技术上讲是作为计时器),该循环没有运行。因此,您的方法从未调用。我想,如果您尝试调用
[[nsrunlop currentRunLoop]run],方法将被调用

来自苹果关于性能选择器的讨论:延时后:

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

您将选择器放入调度队列运行循环(从技术上讲是计时器),该循环不会运行。因此,您的方法从未调用。我想,如果您尝试调用
[[nsrunlop currentRunLoop]run],方法将被调用

来自苹果关于性能选择器的讨论:延时后:

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

您将选择器放入调度队列运行循环(从技术上讲是计时器),该循环不会运行。因此,您的方法从未调用。我想,如果您尝试调用
[[nsrunlop currentRunLoop]run],方法将被调用

来自苹果关于性能选择器的讨论:延时后:

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

您将选择器放入调度队列运行循环(从技术上讲是计时器),该循环不会运行。因此,您的方法从未调用。我想,如果您尝试调用
[[nsrunlop currentRunLoop]run],方法将被调用

来自苹果关于性能选择器的讨论:延时后:

当计时器触发时,线程尝试从运行循环中退出消息队列并执行选择器。如果运行循环正在运行且处于默认模式,则会成功;否则,定时器等待运行循环处于默认模式。

而不是使用<代码> DeXCHOYASYNC/<代码>,考虑<>代码> DeXCHEX> < /P>

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  [UBSNavigationUtils dequeueErrorTime:args];
});
编辑:我只是想帮你清理代码:(


<> >而不是使用<代码> DeXCHOYASYNC/<代码>,考虑<>代码> DeXCHEX> >

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  [UBSNavigationUtils dequeueErrorTime:args];
});
编辑:我只是想帮你清理代码:(


<> >而不是使用<代码> DeXCHOYASYNC/<代码>,考虑<>代码> DeXCHEX> >

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  [UBSNavigationUtils dequeueErrorTime:args];
});
编辑:我只是想帮你清理代码:(


<> >而不是使用<代码> DeXCHOYASYNC/<代码>,考虑<>代码> DeXCHEX> >

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  [UBSNavigationUtils dequeueErrorTime:args];
});
编辑:我只是想帮你清理代码:(


您是如何判断它没有被调用的?您是在要检查的方法中放置了断点还是只是UILabel没有隐藏?您是在主线程上执行淡出/隐藏吗?您是如何判断它没有被调用的?您是在要检查的方法中放置了断点还是只是UILabel没有隐藏?您是在主线程上执行淡出/隐藏吗ad?您是如何认为它没有被调用的?您是在要检查的方法中放置断点还是只是UILabel没有隐藏?您是在主线程上执行淡出/隐藏吗?您是如何认为它没有被调用的?您是在要检查的方法中放置断点还是只是UILabel没有隐藏?您是在主线程上执行淡出/隐藏吗Thread?很抱歉。我在思考完之前点击了save。哦,没问题。这对我所追求的完美效果。很抱歉。我在思考完之前点击了save。哦,没问题。这对我所追求的完美效果。抱歉。我在思考完之前点击了save。哦,没问题。这对我所做的完美效果之后。很抱歉。我还没想好就按下了保存键。哦。没问题。这对我想要的东西非常有效。