我有一個應用程序,其網絡活動在其單獨的線程中完成(並且網絡線程不斷從服務器獲取數據並更新顯示 - 顯示調用已完成回到主線程)。當用戶註銷時,主線程調用上的網線斷開方法如下:performSelector:OnThread:waitUntilDone不會一直執行選擇器
[self performSelector:@selector(disconnectWithErrorOnNetworkThread:) onThread:nThread withObject:e waitUntilDone:YES];
這個選擇被調用的大部分時間,一切工作正常。然而,這個調用永遠不會返回(換句話說,選擇器永遠不會執行)並且線程和應用程序掛起的時候(可能是十次中的兩次)。任何人都知道爲什麼performSelector行爲不正常?
請注意,我需要等到呼叫得到執行,這就是爲什麼waitUntilDone爲YES,因此將其更改爲NO不適用於我。此外,網絡線程的運行循環正在運行(我在創建線程時明確地啓動它)。
請注意,由於數據傳輸的連續性,我需要明確使用NSThreads而不是GCD或Operations隊列。
當斷開連接失敗時,您是否暫停了調試程序以查看哪些代碼正在運行?它可能正處於數據傳輸的中間,因此直到下一次運行循環時纔會取消該數據塊的發送或接收。 – Joe
Joe,小數據交換中收到數據,因此一旦當前數據傳輸結束,就應該調用選擇器。運行循環應在完成當前數據傳輸後安排斷開連接。這大概是80%的時間,而不是所有的時間。至於調試器,它會在disconnectWithErrorOnNetworkThread調用中暫停,然後等待。也實際disconnectWithErrorOnNetworkThread方法永遠不會進入(我有一個NSLog在該方法的開始,永遠不會被調用)。 –
我認爲@Joe詢問目標線程('nThread')發生了什麼,而不是在調用線程中發生了什麼。如果目標線程永遠不會回到它的主循環,它永遠不會爲您執行選擇器。 – abarnert