[英]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异步处理图像,但不知道从数据部分开始。
我认为您需要做的是:
创建一个简单的缓存,如字典数组,其中key
是url
, value
是data
。
当您显示一个新的单元格时check the cache at first
,如果其中没有任何内容- send asynchronous request
服务器send asynchronous request
(也很高兴知道我们是否在等待响应)
当您收到来自服务器的响应时,请填充高速缓存并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.