2010-05-27 8 views
1

我一直在使用NSURLConnection來做一個HTTP post來建立連接。我還實現了didReceiveData委託來處理傳入的字節,因爲它們變得可用。在iPhone/Cocoa環境中打開HTTP服務器的流式連接?

當傳入的數據通過didReceiveData傳入時,我將NSData添加到數據緩衝區,並嘗試解析字節流,如果有足夠的數據進入完成消息分段。我很難管理數據緩衝區(NSMutableData對象),以刪除已解析爲結構的字節。如果有更簡單的方法,我們很好奇。我的didReceiveData委託在下面。

它可以工作,但我不認爲我在將消息段(currMsg)從responseData緩衝區中複製出來並調用processMsg後正在正確管理內存。在模擬器下運行時,我得到了雙倍的免費錯誤 - 程序不會崩潰。我發現NSMutableData/NSData提供了將字節添加到結尾的方法,但是我沒有看到從頭開始刪除字節的任何方法(表示已經被解析的字節的字節數),我將不勝感激關於如何最好地移除分析字節的一些建議從響應數據緩衝區。我來自一個主要是C背景,所以我不知道是否有更好的方式來操作NSData字節指針。我想避免複製,如果可能的話 - 只是想處理一部分responseData緩衝並留下下一次在responseData剩下足夠的字節是在它的解析。

感謝

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

NSData *tmpBuffer = nil; 
NSInteger currMsgSize = 10; 

[responseData appendData:data]; 
NSInteger rspDataLen = [responseData length]; 

while(rspDataLen >= 10) { 

    currMsg = [[NSData alloc] initWithBytesNoCopy:(void *)[responseData bytes] length:currMsgSize]; 

    [self processMsg:currMsg]; 

    [currMsg release]; 
    [responseData getBytes:tmpBuffer range:NSMakeRange(currMsgSize, rspDataLen - currMsgSize)]; 
    [responseData release]; 
    responseData = [[NSMutableData alloc] initWithBytesNoCopy:(void *)tmpBuffer length:rspDataLen - currMsgSize]; 
    rspDataLen = rspDataLen - currMsgSize; 
} 

}

+0

我不能提供替代解決方案,但我過去也做過同樣的事情。你能澄清你的問題,包括你遇到的特殊問題嗎? – warrenm 2010-05-27 20:32:34

+0

謝謝你的迴應。所以,我添加了我的didReceiveData方法,看起來像上面和更多的信息澄清。 – Paul 2010-05-27 23:55:49

+0

NSRange rangeToDelete = {0,sizeof(int)}; [incomingDataBuffer replaceBytesInRange:rangeToDelete withBytes:NULL length:0]; – Paul 2010-05-28 02:00:08

回答

0

你在哪裏分配第一個responseData?

什麼是[self processMsg:currMsg]處理數據?如果期望數據在-processMsg後返回,並且它沒有明確地創建副本,那麼你遇到了麻煩。

Infact,除非您在didReceiveData:返回之前完成了接收的數據,否則您需要在某個地方複製它,這在代碼中是不可見的。

您需要爲tempBuffer分配存儲空間,而不是傳入未初始化的指針;

您應該看看可能是預滾動實現的簡單環形緩衝區。周圍有很多。

相關問題