我有一个iOS应用程序,它使用以下方法从Web服务获取用户的积分:
+(void)fetchPointsForUser:(NSString*)usuario WithCompletionHandler:(Handler2)handler{
NSURL *url = [NSURL URLWithString:@"http://myserver.com/myapp/readpoints.php"];
NSDictionary *postDict = [NSDictionary dictionaryWithObjectsAndKeys:usuario, @"userNa", nil];
NSData *postData = [self encodeDictionary:postDict];
// Create the request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
__block NSArray *pointsArray = [[NSArray alloc] init];
dispatch_async(dispatch_get_main_queue(), ^{
// Peform the request
NSURLResponse *response;
NSError *error = nil;
NSData *receivedData = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
if (error) {
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
NSLog(@"HTTP Error: %d %@", httpResponse.statusCode, error);
return;
}
return;
}
NSString *responseString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
pointsArray = [NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSASCIIStringEncoding] options:0 error:nil];
if (handler)
handler(pointsArray);
});
}
然而,这是非常昂贵的,因为我基本上是通过usersArray进行枚举,并每次将单个用户发送到这个类方法。所以我想我应该修改我的Web服务来处理不同的请求,我把字典而不是个人用户发送给它。
我当前的php如下所示:
<?php
include_once("JSON.php");
$json = new Services_JSON();
$link = mysql_pconnect("localhost", "user", "pass") or die("Could not connect");
mysql_select_db("mydb") or die("Could not select database");
$username = $_POST["userNa"];
$result = mysql_query("SELECT username, SUM(points) AS PUNTOS FROM tags WHERE username='$username' GROUP BY username");
// Print out result
while($row = mysql_fetch_array($result)){
echo $row['SUM(points)'];
}
// THIS RETURNS ARRAY NOT READ PROPERLY BY iOS JSON
$resultado = array();
while($obj = mysql_fetch_object($result)) {
$resultado[] = $obj;
}
Echo $json->encode($resultado);
?>
如果我错了,请纠正我。
您有一个web服务——输入值是"UserName",输出是针对该UserName的点。你有一个用户名列表,所以你必须一个接一个地调用这个web服务。
为什么不将您的web服务更改为:输入值为"用户名列表",输出为"点列表"?它会让你的应用程序只调用一次网络服务。但您需要更改iOS中的web服务调用功能。
在web服务(PHP)中,mysql_query基本上是一个字符串,您可以根据输入(UserName列表)以编程方式生成mysql_query字符串,并返回所需的数据。
我不是回答php脚本的合适人选,但我可以给出一些如何创建查询字符串的想法。下面的代码只是一个想法。
//You have a list of Username - $array
//If array count is zero then just return
//If array has data then do the follow logic
//Generate your Query string programmatically
$query_string = "SELECT username, SUM(points) AS PUNTOS FROM tags WHERE username = ".$array[0] ;
for ($i = 1; $i < count($array); $i++){
$query_string .= " OR username=".$array[$i];
}
$query_string .= " GROUP BY username";
//print your query string and try it from PHP Admin, If it runs OK then you create it successfully
$result = mysql_query($query_string);
//$result is here is nothing but a result table
//Then return it using json format
希望这能对你有所帮助。