Android Firebase 从多个位置获取单个值

6 浏览
0 Comments

Android Firebase 从多个位置获取单个值

我有一个键的数组,这些键指向我社交网络中的帖子对象,例如/posts/id/(帖子信息)。\n加载帖子时,我使用observeSingleEventOfType(.Value)方法依次加载/posts/0、/posts/1等。\n我使用lazyTableView每次加载30个帖子,但速度很慢。是否有办法可以使用其中一种查询方法或其他方法来加快速度,即使需要重构JSON树中的数据。\n我正在从Parse重新实现我的应用程序,到目前为止,体验还不错,只有这一点让我有些困惑。\n编辑:\nfunc loadNext(i: Int) { \n // 检查是否存在\n let ideaPostsRef = Firebase(url: \"https://APPURL\")\n ideaPostsRef.childByAppendingPath(i.description).observeSingleEventOfType(.Value, withBlock: {\n (snapshot) in\n if i % 29 == 0 && i != 0 && !self.hitNull { return }\n // 如果为nil则为false\n // 如果不为nil则为true\n if !(snapshot.value is NSNull) {\n let postJSON = snapshot.value as! [String: AnyObject]\n print(\"得到有效的\\(postJSON)\")\n let post = IdeaPost(message: postJSON[\"message\"] as! String, byUser: postJSON[\"user\"] as! String, withId: i.description)\n post.upvotes = postJSON[\"upvotes\"] as! Int\n self.ideaPostDataSource.append(post)\n self.loadNext(i + 1)\n } else {\n // 不存在\n print(\"得到空返回\\(i)\")\n self.doneLoading = true\n self.hitNull = true\n return\n }\n }\n}\n\n这个递归函数从Firebase获取键号为i的值。如果值是NSNULL,则表示这是最后一个要加载的帖子,不再进行加载。如果没有遇到NSNULL,但i % 29 == 0,则作为基本情况返回,以便每次只加载30个帖子(从0开始计数)。当我将doneLoading设置为true时,将使用属性观察器调用tableView.reloadData()。\n以下是我正在获取的数组的示例\n\"ideaPosts\" : [ {\n \"id\" : 0,\n \"message\" : \"测试\",\n \"upvotes\" : 1,\n \"user\" : \"匿名\"\n }, {\n \"id\" : 1,\n \"message\" : \"测试2\",\n \"upvotes\" : 1,\n \"user\" : \"匿名\"\n } ]\n

0
0 Comments

在这个问题中,出现了性能不佳的原因是代码中请求一次从服务器获取一项数据,然后等待返回后再加载下一项数据。这样的方式会导致等待的时间变长,导致性能下降。为了提高性能,可以将所有请求一次性发送给服务器。

解决方法是将所有请求发送到同一个连接中,使用Promise.all()方法将所有请求并行处理。这样可以减少等待时间,提高性能。

在给出的示例代码中,loadVideosSequential函数是顺序加载数据的方式,而loadVideosParallel函数是使用Promise.all()方法并行加载数据的方式。

通过对比可以看出,顺序加载64个项目需要3.8秒,而使用并行加载只需要600毫秒。具体的时间取决于网络连接的延迟和带宽,但并行加载的方式应始终更快。

此外,还有其他方法可以实现并行加载数据,比如使用Observables。对于Android平台,可以使用更新的Android SDK来获取整个数据快照。

对于Swift语言,可以通过在网络上搜索"Swift中是否有Promise.all的等效方法"来寻找相关的解决方案。

总结起来,通过一次性发送多个请求并使用适当的方法并行处理,可以提高从多个位置获取单个值的性能。这样可以减少等待时间,提高应用的响应速度。

0