簡體   English   中英

semaphore_wait_trap,GCD和CocoaAsyncSocket

[英]semaphore_wait_trap, GCD and CocoaAsyncSocket

我目前正在使用CocoaAsyncSocket構建一個App。 我連接到TCP服務器並讀/寫一些數據。

我使用創建套接字

self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

收到數據后,我使用FMDB將其保存到數據庫中。 一切正常,直到我將應用程序發送到后台(使用Homebutton),然后恢復它。 調試器顯示,UI正在凍結且沒有響應,它正在semaphore_wait_trap中等待。

不要將主隊列用作delegateQueue參數的參數。 使用您自己創建的全局並發隊列之一或串行/並行隊列。

更新:我剛剛看了GCDAsyncSocket的實現,現在意識到委托隊列和方法被觸發異步到實際的讀/寫操作,這發生在內部隊列上,所以我的建議要么無關緊要(取決於你是什么)實際上是在完成方法中做的,或者至少與你遇到的問題無關。 根據iOS應用程序編程指南 ,我認為正在發生的事情是內部套接字正在關閉。 以機智:

  • 准備好處理基於網絡的套接字中的連接故障。 當您的應用程序因任何原因被暫停時,系統可能會拆除套接字連接。 只要您的基於套接字的代碼為其他類型的網絡故障(例如丟失信號或網絡轉換)做好准備,這不會導致任何異常問題。 當您的應用程序恢復時,如果在使用套接字時遇到故障,只需重新建立連接即可。

您正在使用的GCDAsyncSocket類有一些似乎旨在解決此問題的方法,例如-autoDisconnectOnClosedReadStream,我認為您只需要添加一些代碼來處理斷開/連接重建案例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM