0

在向代码添加 URL 请求之前,我有一个表格视图可以流畅地工作。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

...
   //Get Total Comments
    NSString *strURL = [NSString stringWithFormat:@"http://XX.XX.XX.XX/php/commentsTotal.php?CID=%@", [dict objectForKey:@"id"]];
    NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];


// to receive the returend value
NSString *strResultCI = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
cell.commentCount.text = strResultCI;


return cell;

}

问题是当您滚动表格单元格时,手机必须与我的服务器通信,等待响应,然后将其显示到单元格。
不用说它削弱了我的餐桌表现。我的问题是:有没有人有关于如何简单地将 JSON 数据请求添加到后台线程的好的示例或教程?我正在使用 SDWebImage 异步处理图像,但不知道从哪里开始数据部分。

4

3 回答 3

0

当您需要从网络服务器检索 JSON 数据并需要在后台线程中执行时,请尝试执行以下操作:

dispatch_queue_t webCall = dispatch_queue_create("web call", NULL);
dispatch_async(webCall, ^{
NSString *strURL = [NSString    stringWithFormat:@"http://XX.XX.XX.XX/php/commentsTotal.php?CID=%@", [dict objectForKey:@"id"]];
NSData *dataURL = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]]];
});
dispatch_async(dispatch_get_main_queue(), ^{
NSString *strResultCI = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding]; cell.commentCount.text = strResultCI;
});

使用NSJSONSereliazation基础中的类来解析 json 数据。它根据数据返回字典或数组。dispatch_async(webCall, ^...);为您创建一个后台线程并dispatch_async(dispatch_get_main_queue(), ^...取回主线程,当您需要执行与 UI 相关的任何操作(例如更改单元格文本)时,这是必需的。

另请注意,请尝试提前准备好表格视图单元格数据,而不是在-tableView: cellForIndexPath.

于 2012-10-13T00:32:01.407 回答
0

我认为你需要做的是:

  1. 制作一个像字典数组一样的简单缓存,其中keyisurlvalueis data

  2. 当您显示一个新单元格时check the cache at first,如果那里没有任何东西 -send asynchronous request到服务器(也很高兴知道我们是否正在等待响应)

  3. 当您收到来自服务器的响应时,请填充缓存,并且check the tableView visible cells,如果您收到可见单元格的数据,请使用 tableView 更新(不要重新加载数据,因为它会很慢)

至于我,我正在使用AFNetworkingAPI 调用库(ASIHTTPRequest 也很好)

顺便说一句,我认为您应该在用户快速滚动时取消请求,这可以通过NSOperationQueue. 您可能不希望所有这些请求同时运行,最好只让那些活动,您最需要哪些数据并取消其他请求

于 2012-10-12T21:50:24.580 回答
0

如果这是您进行服务器/客户端通信的唯一点,您只需要执行一个异步 NSURLConnection。

否则,如果您正在进行大量客户端/服务器通信,最好的方法是 AFNetworking 或任何其他 http 客户端库。

于 2012-10-12T23:36:59.437 回答