我有一个表格视图,可以流畅地工作,直到我向代码添加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异步处理图像,但不知道从哪里开始数据部分。
答案 0 :(得分:0)
我认为你需要做的是:
制作一个简单的缓存,就像字典数组一样,其中key
为url
而value
为data
。
当您显示一个新单元check the cache at first
时,如果没有任何内容 - send asynchronous request
到服务器(也很好知道我们是否在等待响应)
当您从服务器收到响应时填充缓存和check the tableView visible cells
,如果您收到可见单元格的数据,请使用tableView更新(不重新加载数据,因为它会很慢)< / p>
至于我,我使用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
。