2

我有以下代碼...dispatch_async不工作的所有時間

-(void) SetSerialNumber 
{ 
    NSLog(@"SetSerialNumber"); 
    NSString *serialNum = textFieldSecond.text; 
    if (textFieldSecond.text == nil) { 
     [self performSelectorOnMainThread:@selector(display:) withObject:@"Please Enter the serial number" waitUntilDone:YES]; 
     return; 
    } 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^(void){ 
     NSString* response; 
     [self performSelectorOnMainThread:@selector(display:) withObject:@"Sending Set Serial Num request" waitUntilDone:YES]; 
     [[testApp sharedClass] SetSerNumber:serialNum]; 

     [self performSelectorOnMainThread:@selector(display:) withObject:@"Waiting for Response..." waitUntilDone:YES]; 
     response = [[Process sharedProcess] readAndProcessData:ACK]; 
     [self performSelectorOnMainThread:@selector(display:) withObject:rpcresponse waitUntilDone:YES]; 
    }); 
} 

的方法display:將郵件到UITextView

當按下按鈕時,我調用這個函數。有時dispatch_async塊沒有被調用。它只是通過它而落下。但是,我可以看到每次都打印日誌消息。

任何人都可以請分享可能會導致這種情況嗎?

+0

如果按下按鈕時調用此函數,爲什麼要調用第一個'performSelectorOnMainThread:withObject:waitUntilDone:'? –

+0

好吧,我不應該使用performSelectorOnMainThread:,它只是爲用戶的消息,沒有什麼比這更多。 –

回答

2

「跌倒」是什麼意思?該調用是異步的,所以不會在那裏發生。在塊中添加一個日誌,看它是否被打印。

你確定當它「通過」時,serialNum不是零嗎?

+0

是的,當serialNum不爲零時,它會通過。有時它有效。另外我每次點擊按鈕都會得到日誌,但dispatch_async塊沒有得到執行。還有一個問題是,在「readAndProcessData」中,它無限期地等待隊列中有數據,這可能是一個問題。不管怎樣,謝謝你的擡頭。 –