2014-10-06 63 views
0

我試圖有一個與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

你是怎麼計算它不叫?你把斷點的方法來檢查或者只是你的UILabel沒有隱藏嗎?你在主線程上執行淡出/隱藏? – F1ank3r 2014-10-06 19:47:16

回答

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]; 
    } 
} 
+0

它的工作 – steventnorris 2014-10-06 19:50:13

+0

對不起,在我完成思考之前,我點擊保存 – 2014-10-06 19:54:28

+0

哦,沒問題,這對我以後的工作完美無缺。 – steventnorris 2014-10-06 19:54:48

2

將選擇器放入dispatch_queue runloop(技術上作爲計時器),即不運行。因此你的方法從來沒有叫過我想,如果你嘗試調用[[NSRunLoop currentRunLoop]run];,方法會被調用。

來自蘋果的討論關於performSelector:afterDelay: 當計時器激發時,線程將嘗試從運行循環中出列消息並執行選擇器。如果運行循環運行並處於默認模式,則成功;否則,定時器會等待,直到運行循環處於默認模式。