把前陣子遇到的問題筆記一下 :
前陣子嘗試著要做iOS裝置間訊息的傳遞
一開始找到了這個聊天室的範例:
http://mobileorchard.com/tutorial-networking-and-bonjour-on-iphone/
用Bonjour network發佈服務,傳輸部份則用CFStream來完成
run範例後跑起來有個問題:選擇了聊天室後,連線卻要等1分鐘左右才會建立
設了一些NSLog都跑完了,也可以打字,不過傳輸的文字還是傳不過去
但一分鐘後連線建立,聊天訊息傳遞得很順暢且很即時
後來看官方文件CFNetwork Programming Guide
在Working with Streams的Preventing Blocking When Working with Streams一段裡面
才知道問題:
CFWriteStreamOpen(myWriteStream)是一件耗時的process
為了避免block,雖然會馬上傳送TRUE,但實際myWriteStream卻還在建立
後來用CFReadStreamGetStatus+while迴圈去看狀態
會一直都是kCFStreamStatusOpening,一分鐘後stream建立,狀態才會變成開啟完成
開啟完成後,指定的callback才會被啟動,連線才建立起來
最後改用NSStream解決,連線馬上就建立了
但還是不懂為什麼CFStream建個連線要這麼久...
範例中CFWriteStreamOpen的一些code可參考:
client(RemoteRoom)建立連線後
server(LocalRoom)過了1分鐘左右才會啟動callback函式
server.m的serverAcceptCallback
connect.m的writeStreamHandleEvent和readStreamHandleEvent
沒有留言:
張貼留言