簡體   English   中英

hasBytes可及早完成

[英]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個字符,它將分成兩部分( beginend日志被調用兩次),所以handleIncomingNotification:由於傳遞了JSON的一半而無法正常工作。

當我登錄len我得到很多1448 ,有時是1479 ,然后是4096

因此,顯然hasBytesAvailable無法正常運行。

我嘗試過更改緩沖區,但這沒有區別。

請幫助我提出解決此問題的方法。 我很驚訝這不是一個簡單的谷歌。


根據xaphod的答案進行編輯

我最終這樣做了:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM