檢索NSData的對象,所以我的應用程序沿着這些線路的工作原理:如何可靠地NSInputStream XCode中
- 一個iPod不斷地發送包含NSDictionaries:在JPEG和一些圖像特性NSString的編碼圖像。
- NSDictionary使用NSPropertyListSerialization格式BinaryFormat_v1_0進行編碼,並通過NSStream以1024字節的數據包的形式發送到在OSX上運行應用程序的中央計算機。
- OSX應用程序接收數據包,不斷附加到單個NSMutableData對象,直到它看到下一個NSData對象的第一個數據包(以我發現的二進制格式開始爲'bplist')。
- 通過調用NSPropertyListSerialization,NSData被轉換回OSD應用程序使用的NSDictionary。
- 一旦NSData成功轉換(或不成功),NSData對象被設置回零以開始讀取下一輪數據包。
還有一些注意事項:NSInputStream和NSOutput流都在NSDefaultRunLoopMode的各自設備的currentRunLoop上運行。
當運行這個過程中,有時會轉換回NSDictionary中工作正常,沒有錯誤(約嘗試的1/3),但其他時間轉換返回此錯誤:
Error: Failed to convert NSData to NSDict : Error Domain=NSCocoaErrorDomain Code=3840 "Unexpected character b at line 1" UserInfo={NSDebugDescription=Unexpected character b at line 1, kCFPropertyListOldStyleParsingError=Error Domain=NSCocoaErrorDomain Code=3840 "Conversion of string failed." UserInfo={NSDebugDescription=Conversion of string failed.}}
以下是
...的方法來處理流事件:
-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
switch(eventCode) {
case NSStreamEventHasBytesAvailable: {
uint8_t buf[1024];
unsigned int len = (unsigned)[(NSInputStream *)aStream read:buf maxLength:1024];
if(len) {
[self handleEventBuffer:buf WithLength:len];
}
...
...和服用方法是從流分析數據的程序部分保健數據:
-(void)handleEventBuffer:(uint8_t*)buf WithLength:(unsigned int)len {
...
NSString *bufStr = [NSString stringWithFormat:@"%s",(const char*)buf];
if ([bufStr containsString:@"bplist00"] && [self.cameraData length] > 0) {
// Detected new file, enter in all the old data and reset for new data
NSError *error;
NSDictionary *tempDict = [[NSDictionary alloc] init];
tempDict = [NSPropertyListSerialization propertyListWithData:self.cameraData
options:0
format:NULL
error:&error];
if (error != nil) {
// Expected good file but no good file, erase and restart
NSLog(@"Error: Failed to convert NSData to NSDict : %@", [error description]);
[self.cameraData setLength:0];
}
...
[self.cameraData setLength:0];
[self.cameraData appendBytes:buf length:len];
} else {
// Still recieving data
[self.cameraData appendBytes:buf length:len];
}
所以,說我在獲得問題是:
- 我如何解決我的分析方法給我可靠的結果是不要隨意無法轉換?
- 或者有沒有比這更好的方法來解析緩衝流爲此目的?
- 或者我只是在做一些愚蠢或缺少明顯的東西?
令人敬畏的,這個伎倆,採取了很多事件處理這種方式,但現在工作順利。謝謝! – blakemacnair