[英]hasBytesAvailable finishing early
我正在將JSON從服務器發送到我的可可應用程序。
可可應用接收如下數據:
case NSStreamEventHasBytesAvailable:
NSLog(@"begin");
if (theStream == inputStream) {
int len;
uint8_t buffer[4096];
NSString* incoming_message = @"";
while ([inputStream hasBytesAvailable]) {
len = (int)[inputStream read:buffer maxLength:sizeof(buffer)];
NSLog(@"\nThe length is -- %d\n",len);
if (len > 0) {
NSString *mess = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
if(mess != nil){
incoming_message = [NSString stringWithFormat:@"%@%@",incoming_message,mess];
}
}
}
NSLog(@"%@",incoming_message);
// handle icoming message
[self handleIncomingNotification:incoming_message];
}
NSLog(@"end");
break;
問題是,如果數據開始大於500個字符,它將分成兩部分( begin
和end
日志被調用兩次),所以handleIncomingNotification:
由於傳遞了JSON的一半而無法正常工作。
當我登錄len
我得到很多1448
,有時是1479
,然后是4096
因此,顯然hasBytesAvailable
無法正常運行。
我嘗試過更改緩沖區,但這沒有區別。
請幫助我提出解決此問題的方法。 我很驚訝這不是一個簡單的谷歌。
我最終這樣做了:
case NSStreamEventHasBytesAvailable:
NSLog(@"begin");
if (theStream == inputStream) {
int len;
uint8_t buffer[1024];
NSString* incoming_message = @"";
while ([inputStream hasBytesAvailable]) {
len = (int)[inputStream read:buffer maxLength:sizeof(buffer)];
if (len > 0) {
NSString *mess = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
incoming_message = [NSString stringWithFormat:@"%@%@",incoming_message,mess];
}
}
[self handleStreamMessage:incoming_message];
}
NSLog(@"end");
break;
handleStreamMessage:
NSString*split_message;
-(void)handleStreamMessage:(NSString*)message{
if(split_message == NULL){
split_message = @"";
}else if([split_message length] > 0){
message = [NSString stringWithFormat:@"%@%@",split_message,message];
}
NSLog(@"message:%@",message);
NSError *error;
NSData* data = [message dataUsingEncoding:NSUTF8StringEncoding];
if ([NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error] == nil)
{
// not finished the stream as not given proper json data
split_message = message;
}else{
[self handleIncomingNotification:message];
split_message = @"";
}
}
這似乎是一個可怕的黑客作品。
這不是NSStream網絡流的工作方式。 如果發送X字節,則接收方將收到N倍的數量,總和(最終)將為X。N可能是1、7或42-取決於多種情況。
您需要做的是解析JSON傳入的內容,並確定何時完成接收足以使它有意義的事情。 看看YAJLParser,我用它與twitter api做到了這一點。 讓我給你一個鏈接...
..我的叉子在這里: https : //github.com/xaphod/yajl-objc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.