如何在Objective-C中加载数据期间异步加载JSON数据并填充UITableView
Posted
技术标签:
【中文标题】如何在Objective-C中加载数据期间异步加载JSON数据并填充UITableView【英文标题】:How to load JSON data asynchronously and populate UITableView during the data loading in objective-C 【发布时间】:2014-07-29 20:00:42 【问题描述】:我是 ios 和目标 C 编程的初学者,但我遇到了一个我无法解决的问题,因为我不知道从哪里开始,不知道该做什么。这是上下文:我有一个侧边栏菜单(如 facebook 的菜单),当您选择此侧边栏菜单的类别时,我会显示一个 UITableView,其中包含图像列表和一些文本,图像列表和文本来自带有 JSON 提要的互联网。我的应用程序目前运行良好,但每次我更改类别时,它都会冻结从 Internet 加载 JSON 数据的时间。这是我的 TableViewController.m 的代码示例:
- (void)viewDidLoad
[super viewDidLoad];
[self refreshTable];
-(void)refreshTable
// Send a synchronous request
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:URLValue]];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&error];
if (error == nil)
// Parse JSON data
由于我真的是初学者,因此我非常感谢您对要遵循的步骤进行一些解释。我发现了一些类似的问题,他们谈到了委托,委托是什么以及我如何称呼它?
非常感谢大家花时间阅读我的问题。
【问题讨论】:
执行异步数据传输并在“传输完成”方法/块中解析 JSON。然后从 JSON 向reloadData
发送表视图信号。
我有一个项目可以做到这一点。你可以在这里查看:github.com/AdamPro13/Reddit-Search-and-Share
关于我之前的帖子,你需要使用 CocoaPods。他们非常直截了当。安装后,只需在终端中运行 pod install
即可安装所需的 pod。
【参考方案1】:
你要使用:
[NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
// parsing code goes here
// update table view
[self.tableView reloadData];
将您的解析代码移动到完成块内。欲了解更多信息,请参阅:https://developer.apple.com/library/Mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/occ/clm/NSURLConnection/sendAsynchronousRequest:queue:completionHandler:.
解析结束可以调用[self.tableView reloadData]
刷新。
【讨论】:
您也可以使用AFNetworking
(github.com/AFNetworking/AFNetworking),这是一个适用于 iOS 的开源网络库,它有很好的文档,让 iOS 上的网络变得有趣:)
@Cornelius 非常正确,但因为这很简单/他已经有NSURLConnection
我认为另一种方法更容易。对于更复杂的任务,尽管一定要走AFNetworking
路线。
我们应该补充一点,虽然解析响应数据可以在辅助线程上执行,但设置表视图的数据(或数据源或“模型”)和调用reloadData
应该发生在主线程上. ;)
@CouchDeveloper 我已经更新了答案以更好地反映这一点。
嗨 cabellicar123,非常感谢您的回答,它解决了我的问题,现在我的应用程序不再冻结。但是,该行为仍然不是非常用户友好,因为表格显示为空几秒钟,然后重新加载数据。你能告诉我如何添加一个活动指示器来告诉用户它正在刷新吗?而且,我不想在一个块中显示所有数据,而是希望在加载 viewcell 的内容后立即显示数据以上是关于如何在Objective-C中加载数据期间异步加载JSON数据并填充UITableView的主要内容,如果未能解决你的问题,请参考以下文章
如何实现 Asynctask 在 ArrayAdapter 中加载图像