如何在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的主要内容,如果未能解决你的问题,请参考以下文章

在 React.js 中加载异步数据时防止 UI 闪烁

在一组objective-c Xcode中加载文件

如何在 React 测试中加载 Stripe?

如何实现 Asynctask 在 ArrayAdapter 中加载图像

在 Python ctypes 中加载共享库期间出现分段错误(核心转储)

如何在 Chrome 中加载下一页之前断开 websocket