在我的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!
}
为什么会这样?我该如何解决这个问题?
希望我自己解释一下,谢谢你。答案 0 :(得分:2)
当人们使用NSURLConnectionDataDelegate
方法(或NSURLSessionDataDelegate
方法)并且没有意识到可能需要多次调用didReceiveData
来接收整个有效负载时,此问题很常见。
所以,你能做的是:
在NSMutableData
中实例化didReceiveResponse
;
让didReceiveData
仅向NSMutableData
附加数据,认识到对于较大的有效负载,在收到所有数据之前可能需要多次调用此方法;以及
在connectionDidFinishLoading:
中(如果使用NSURLConnection
;如果使用NSURLSession
,请使用URLSession:task:didCompleteWithError:
方法),然后继续解析所有数据接收。