2012-05-24 38 views
0

我正在使用(並且需要使用)我沒有源代碼的第三方框架。第三方框架處理創建經過身份驗證的客戶端/服務器連接並回傳一對開放的NSStream。我面臨的挑戰是NSStreams被安排在主線程中(創建UI可能無響應的情況 - 這是我想避免的)。主線程上計劃的打開但不活動的NSStream是否可以移至其他線程?

當流從第三方框架中被移交時,沒有網絡流量正在進行。所以,我想知道我是否可以不計劃並重新安排NSStreams。

有誰知道是否有可能取消調度一個開放的NSStream並重新安排在另一個線程上的另一個運行循環?會導致問題嗎?那裏有代碼示例嗎?

在此先感謝!

亞倫

+0

它實際上是在線程中調度它還是阻塞?如果它只是阻塞,你可以在函數調用中使用NSInvocationOperation來阻止它。 – heckman

+0

@heckman我不確定我是否理解你的問題。我收到一個NSInputStream和一個NSOutputStream。當我收到NSStreamStatusOpen時,它們都處於狀態。在我開始發送東西之前,沒有任何流量在流上,所以它們有效地停滯。在主線程中,當代理消息被接收/服務時,他們將創建阻塞情況。 – xyzzycoder

+0

請參閱下面的回覆。 – heckman

回答

0

如果我正確理解您的應用程序,這意味着你的應用程序接收到特定流的引用,並且你負責對蒸閱讀一切。讀取這些流應該是你通過NSThread,NSOperation或其他線程機制從應用程序強制到後臺的東西。

例子:

在任何文件你tieing在此NSInputStream:

@property (strong, nonatomic) NSInvocationOperation *parseOp; 

(id)startInputRead:(NSInputStream *)input { 
    if([input hasBytesAvailable]) { 
     self.parseOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(readAndStoreInput:) object:inputStream]; 

    } 

如果你的讀者是這樣的:

(void)readAndStoreInput:(NSInputSteam*) input{ 
    //process your input steam into your system in the background 

} 

這是多麼你將一個簡短的例子爲輸入端做這個。你也可以用類似的方式排隊輸出蒸汽。這應該使所有內容都能同時運行,並且您的應用可以保持響應。

+0

嗨。但是蘋果的文檔卻說:「你永遠不應該試圖從一個不同於擁有該流運行循環的線程訪問一個定時流。」 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html#//apple_ref/doc/uid/20002273-BCIJHAGD – xyzzycoder

+0

我認爲這個迴應中的代碼會對於NSStream的讀取位置是線程不可知的。蘋果的文檔似乎很清楚,這是一個禁忌。 – xyzzycoder

+0

@xyzzycoder你在執行scheduleInRun循環?沒有理由說你無法將清單1中的所有代碼放在後臺子進程中 – heckman

相關問題