自动刷新 JSON
Posted
技术标签:
【中文标题】自动刷新 JSON【英文标题】:Auto Refresh JSON 【发布时间】:2016-12-06 18:35:57 【问题描述】:所以我的应用程序从我无法控制的服务器中提取 JSON,并解析该 JSON 以填充 UITableView
。
我想更新我的UITableView
以实时反映服务器上可用的最新信息。所以每当服务器发生变化时,我的 UITableView 也会更新。
现在想到的一种解决方案是连续发送GET
请求,让我们说一分钟后,解析 JSON 并重新加载表上的数据。
但是,这个问题必须有其他解决方案。我试过搜索,但到目前为止没有成功。
现在我明白这个问题在 *** 的标准中有些主观,但我真的需要关于这件事的帮助,而且我对从哪里开始没有丝毫线索。因此,我们将不胜感激。
【问题讨论】:
最简单的方法是使用定时器。如果需要实时性,请使用socket 代替http 连接。 您可以参考我的答案以获得解决方案:***.com/a/41002245/3077339 但我不想使用计时器,而且服务器不在我的控制范围内,所以我无法发送推送通知 您可以创建一个中间服务器,不断轮询其他服务器(您无法控制),然后让客户端通过套接字连接到您的服务器。 我的想法正是@Caleb。这比让任意数量的客户端轮询要好得多。 【参考方案1】:重复的 GET 通常是不受欢迎的,因为它在没有任何事情发生时需要客户端和服务器资源,这可能是大多数时间。
由于您不控制服务器,我建议您构建一个您控制可以执行轮询的服务器,然后在检测到时发送推送变化。与来自客户端的轮询相比,这有两个优势:它可以更好地扩展,因为世界上只存在一个轮询源,并且它与纯推送方法一样节省了客户端能量。
Apple provides a push system (APNS),其中您的服务器向您的 ios 设备发送消息(通过 Apple)。设备将在后台启动您的应用并调用:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
在您的应用委托上。
【讨论】:
正是我不想重复 GET,问题是我不拥有服务器,所以我不能真正从服务器发送消息 这可能是最佳解决方案。只需注意在您的应用程序中设置故障转移选项:如果用户不批准推送通知,那么您可能希望在每个应用程序处拉动服务器(无论如何您可能都想这样做),然后每 15 分钟左右拉动一次 - 如果那样的话有道理...取决于人们如何使用您的应用程序:他们是否启动它然后盯着它看两个小时?大多数情况下,每个applicationDidBecomeActive:
的刷新和可选的“下拉刷新”(因为您使用的是 UITableView,这将是一个 10-liner...)已经绰绰有余了...【参考方案2】:
如上述答案所述,最好使用 APNS。 但是,如果您确实无法控制服务器,那么正如您所描述的,除了轮询之外您无能为力。由于您正在为 iOS 编写代码,因此建议您考虑以下几点:
Wifi 限制:您是否正在获取一个很小的有效负载,这样无论您是否使用 wifi 都无关紧要?否则,您应该将可达性配置为不会拖累用户的蜂窝服务。 后台会话和后台执行:考虑使用 NSBackgroundUrlSession 来请求此数据。后台会话对操作系统来说更有效,因为它们允许操作系统机会性地执行请求。如果您需要为后台会话自定义 NSURLSessionTasks,请考虑后台执行权利。 可扩展性:您的后端能否处理来自大量用户的连续请求? 更好的解决方案可能使用 APNS,或 Socket / WebSockets / Socket.io / firebase / 等。【讨论】:
【参考方案3】:正常的静默通知是最好的解决方案
当您在服务器上添加任何新项目时,您可以向设备发送推送通知(静默推送通知)以通知您在服务器端添加了某些内容的状态。
当设备收到此类推送通知时,您必须调用 API 并重新加载表格视图。所以你不必每 10 秒重新加载一次 tableview。
它“不会在通知栏中显示通知警报,但它只会在您想要推送新内容时通知您的应用有一些新数据可用。
在通知中心显示:否
唤醒应用执行后台任务:是
只需在推送通知中从服务器端添加以下paylod “内容可用”:1
"content-available" : 1
【讨论】:
以上是关于自动刷新 JSON的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 php 或 javascript 在不刷新页面的情况下自动更新 JSON 数据?