2012-07-17 43 views
3

我不知道如何使用標籤參數的方法,如GCDAsyncSocket標籤參數

readDataWithTimeout: tag: 
writeData: tag: 

,如果我想使用標籤來識別數據包的類型,會發生什麼?例如,我說標記== 2意味着數據包是來自客戶端的消息,標記== 1意味着數據包是來自服務器的消息... 如果這是好的,我是否需要調用readData:withTag :幾次(每個不同的標籤一次)?

[readDataWithTimeout:-1 tag:1]; 
[readDataWithTimeout:-1 tag:2]; 

有沒有辦法地說:「每次讀取數據,而無需關心標籤」,然後在didReadData:withTag:方法根據標籤處理數據?

回答

6

我認爲你對標籤概念有些誤解。讀取操作不是說「讀取已被標記爲2的數據」。他們說:「讀取下線的數據,並將其標記爲2以供將來參考。」

標籤永遠不會通過網絡發送 - 服務器不會標記數據並將其發送給客戶端進行讀取。這是一個完全可選的概念,僅用於區分本地操作。換句話說,正在讀取的數據沒有標籤。該標籤是您分配給讀取操作的內容,因此您可以在稍後完成識別。

例如,假設您正在將數據讀取爲一系列標題和有效內容。您可以使用標籤來區分有效載荷讀頭讀取:

const NSInteger kHeaderTag = 1; 
const NSInteger kPayloadTag = 2; 

// Assume you know to expect a header, so tag the read operation as such. 
[self readDataWithTimeout:-1 tag:kHeaderTag]; 

// Next assume you know to expect a payload, so tag the read operation as such. 
[self readDataWithTimeout:-1 tag:kPayloadTag]; 

那麼你以後就能認出它...

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
{ 
    if (tag == kHeaderTag) 
    { 
     // Handle header 
    } 
    else if (tag == kPayloadTag) 
    { 
     // Handle payload 
    } 
} 
+0

謝謝,我更仔細閱讀doc和了解。爲了確定數據包的「類型」,我決定將所有數據都包含在NSDictionary中,並使用一個可以識別數據包的密鑰。例如,當我讀取一個NSData時,我提取密鑰(NSString)並根據密鑰處理該數據包。這是一種好的做法,還是應該改變我的方法? – rmonjo 2012-07-18 08:14:37

+0

@ user1437126所以你要序列化字典以及數據?聽起來對我很好。 – 2012-07-18 15:23:11

+0

是的,這就是我所做的。整個下午都測試了這個解決方案,高效且乾淨。再次感謝您的回覆 – rmonjo 2012-07-18 16:56:24