异步JSON请求

时间:2012-10-12 21:19:20

标签: ios xcode json multithreading asynchronous

我有一个表格视图,可以流畅地工作,直到我向代码添加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异步处理图像,但不知道从哪里开始数据部分。

3 个答案:

答案 0 :(得分:0)

我认为你需要做的是:

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

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

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

  4. 至于我,我使用AFNetworking库进行API调用(ASIHTTPRequest也很好)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

当您需要从Web服务器检索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