我一直在使用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;
}
}
我不能提供替代解決方案,但我過去也做過同樣的事情。你能澄清你的問題,包括你遇到的特殊問題嗎? – warrenm 2010-05-27 20:32:34
謝謝你的迴應。所以,我添加了我的didReceiveData方法,看起來像上面和更多的信息澄清。 – Paul 2010-05-27 23:55:49
NSRange rangeToDelete = {0,sizeof(int)}; [incomingDataBuffer replaceBytesInRange:rangeToDelete withBytes:NULL length:0]; – Paul 2010-05-28 02:00:08