繁体   English   中英

异步JSON请求

[英]Asynchronous JSON request

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

我认为您需要做的是:

  1. 创建一个简单的缓存,如字典数组,其中keyurlvaluedata

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

  3. 当您收到来自服务器的响应时,请填充高速缓存并check the tableView visible cells ,如果您收到了可见单元格的数据,请使用tableView更新来执行此操作(不重新加载数据,因为这样做会很慢)

对我来说,我正在使用AFNetworking库进行API调用(ASIHTTPRequest也很好)

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

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

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

每当您需要从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准备好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM