我正在尝试在延迟上使用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];
}
}
但是,我的方法永远不会被调用。
答案 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];
}
}