从php到iOS app的json响应不完整

时间:2014-02-11 22:40:52

标签: php ios json

在我的iOS应用程序中,我有一个异步连接,在我的服务器上调用php脚本。该脚本对数据库进行查询并使用json_encode给出响应。

这是剧本:

$result = mysql_unbuffered_query($query);
if ($result){
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
        $output[] = $row;
    }
    if($output!=null)       
        echo json_encode($output);
    else 
        echo "0";
}

当响应很短时,一切都很好,但是当我有一个很长的响应(比如500个字符)时,我会收到一个不完整的json,如下例所示:

[{"user":"1","password":"password","tel":"3333333333","description":"some text, some text, some text","data":"2013-10-13 09:53:54"}, {"user":"1","password":"password","tel":"3333333333","description":"some text, so

在我的iOS应用程序中,我使用此代码解码json:

json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

如果我收到一个完整的json一切正常,否则如果我收到一个不完整的json我发送一个新的请求。当json内容非常长时,收到的json是不完整的,但有时候,在一些请求之后,无论如何响应都是好的。

/ *更新问题* /

执行请求:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:advertURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[request setHTTPMethod:@"POST"];

NSString *queryString = [NSString stringWithFormat: @"%@", query];
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
myConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

获得回复:

//in NSURL method didReceiveResponse

ResponseData = [[NSMutableData alloc] init];

//in NSURL method didReceiveData

[ResponseData appendData:data];

NSString *result = [[NSString alloc] initWithData:ResponseData encoding:NSUTF8StringEncoding];
json = [NSJSONSerialization JSONObjectWithData:Responsedata options:kNilOptions error:&error];

if(!json){
    //incomplete json!
}
else{
    //good json!
}

为什么会这样?我该如何解决这个问题?

希望我自己解释一下,谢谢你。

1 个答案:

答案 0 :(得分:2)

当人们使用NSURLConnectionDataDelegate方法(或NSURLSessionDataDelegate方法)并且没有意识到可能需要多次调用didReceiveData来接收整个有效负载时,此问题很常见。

所以,你能做的是:

  • NSMutableData中实例化didReceiveResponse;

  • didReceiveData仅向NSMutableData附加数据,认识到对于较大的有效负载,在收到所有数据之前可能需要多次调用此方法;以及

  • connectionDidFinishLoading:中(如果使用NSURLConnection;如果使用NSURLSession,请使用URLSession:task:didCompleteWithError:方法),然后继续解析所有数据接收。