我正在使用活动记录mysql在rails后端创建一个带有ruby的iOS应用程序
该应用程序能够发布各种类型的媒体(图像,GIF,视频)
任何用户都可以发布帖子,并且布尔标志is_private为false的帖子会显示在应用程序上可见的全局Feed中(想想Facebook新闻源)。
对于这个全局Feed,我需要建立分页并拉动刷新。
应用程序方面我已经构建了网络服务和模型,但我需要强化如何获取全局供稿数据的逻辑。
我的问题是:
- 后端和应用程序通信的常见结构是什么。 - 到目前为止,我有一个获取初始页面的方法和一个从最后一个当前项目开始下一页的方法。
- 我如何处理这样一个事实:当用户滚动导致连续性问题时,更多项目被放入数据源的头部(顶部)?
答案 0 :(得分:1)
写入一致性的分页比盲目分页更难。分页的基础是你想要加载一个初始集,然后能够从最后一次获取点开始向下(通常是在时间上)。
两种类型的分页:
获取列表的头部并存储从服务器返回的列表中的最后一个ID。在下一个请求(当用户滚动到列表的底部时)发送最后一个看到ID,然后过滤到最后一个看到id之后的下一个m项**
响应= [12,11,10,9,8]
last_id = response.last
响应= [7,6,5,4]
[19,18,17,16,15]
答案 1 :(得分:1)
有趣的问题!!!!
我所掌握的最佳信息是如何“实时”从后端“接收”数据。我不确定你将如何处理JS滚动机制
-
<强>活强>
系统的“实时”功能基本上是通过SSE或Websocket(异步连接)传递数据来处理的,以使其看起来像您的应用程序“实时”运行。
实际上,“实时”应用程序只不过是那些不断“监听”服务器的应用程序 - 允许您接收他们发送的任何数据。用JS
放在页面上如果您想永久保持“Feed”的最新状态,我建议您使用以下任一技术:
<强> SSE的强>
执行此操作的最基本方法是使用server sent events
- 一种HTML5技术,它基本上允许您使用text/stream
content-type
将数据从服务器传递到DOM:
这被认为是从服务器处理更新的“本地”方式:
#app/assets/javascripts/application.js
var source = new EventSource("your_end_point");
source.onmessage = function(event) {
//your data here
};
可以使用ActionController::Live::SSE
控制器在Rails端补偿:
class MyController < ActionController::Base
include ActionController::Live
def index
response.headers['Content-Type'] = 'text/event-stream'
sse = SSE.new(response.stream, retry: 300, event: "event-name")
sse.write({ name: 'John'})
sse.write({ name: 'John'}, id: 10)
sse.write({ name: 'John'}, id: 10, event: "other-event")
sse.write({ name: 'John'}, id: 10, event: "other-event", retry: 500)
ensure
sse.close
end
end
SSE的问题是它们与ajax long-polling基本相同;因为你的前端JS会不断地每秒发送请求。我不喜欢这个
-
<强>的WebSockets 强>
Websockets是连接的“正确”方式。以“实时”方式接收数据:
http://java.inapp.com/wp-content/uploads/2013/07/ws_vs_http.png
它们基本上允许您在前端和服务器之间打开永久连接,这意味着您不必向服务器发送持续请求。我对websockets没有多少经验,但我做 Pusher
-
<强>推强>
我强烈推荐pusher
- 这是第三方的websocket系统(我不以任何方式与他们联系)
简单地说,它允许您向Pusher服务发送更新,并在您的系统上阅读它们。它解决了为您自己的websocket
应用提供连接所带来的所有麻烦。
您可以阅读how it works,以及学习pusher gem