当前位置: 首页 > 知识库问答 >
问题:

通过使用查询而不是重复观察单个事件来加快为我的社交网络应用程序获取帖子的速度

祖麻雀
2023-03-14

我有一个键数组,它导致我的社交网络的post对象,如so/posts/id/(post info)

func loadNext(i: Int) { 

    // check if exhists
    let ideaPostsRef = Firebase(url: "https://APPURL")

    ideaPostsRef.childByAppendingPath(i.description).observeSingleEventOfType(.Value, withBlock: {
        (snapshot) in

        if i % 29 == 0 && i != 0 && !self.hitNull { return }
            // false if nil
            // true if not nil
        if !(snapshot.value is NSNull) {
            let postJSON  = snapshot.value as! [String: AnyObject]
            print("GOT VALID \(postJSON)")
            let post = IdeaPost(message: postJSON["message"] as! String, byUser: postJSON["user"] as! String, withId: i.description)
            post.upvotes = postJSON["upvotes"] as! Int
            self.ideaPostDataSource.append(post)
            self.loadNext(i + 1)
        } else {
            // doesn't exhist
            print("GOT NULL RETURNING AT \(i)")
            self.doneLoading = true
            self.hitNull = true
            return
        }
    }
}

这个递归函数本质上是从Firebase中获取键号i的值。如果是NSNULL,它知道这是最后一个可能加载的帖子,并且不会再加载了。如果没有命中NSNULL,但I%29==0,则返回基本情况,因此一次只加载30个帖子(0个索引)。当我将DoneLoading设置为true时,将使用属性观察器调用tableView.reloadData()

下面是我获取的数组的示例

"ideaPosts" : [ {
    "id" : 0,
    "message" : "Test",
    "upvotes" : 1,
    "user" : "Anonymous"
  }, {
    "id" : 1,
    "message" : "Test2",
    "upvotes" : 1,
    "user" : "Anonymous"
  } ]

共有1个答案

上官扬
2023-03-14

更新:我们现在还将在AskFirebase中讨论这个问题。

从Firebase加载许多项并不一定很慢,因为您可以对请求进行流水线处理。但是您的代码使这变得不可能,这确实会导致次优性能。

在您的代码中,您从服务器请求一个项,等待该项返回,然后加载下一个项。在如下所示的简化序列图中:

Your app                     Firebase 
                             Database

        -- request item 1 -->
                               S  L
                               e  o
                               r  a
                               v  d
                               e  i
        <-  return item  1 --  r  n
                                  g
        -- request item 2 -->
                               S  L
                               e  o
                               r  a
                               v  d
                               e  i
                               r  n
        <-  return item  2 --     g
        -- request item 3 -->
                 .
                 .
                 .
        -- request item 30-->
                               S  L
                               e  o
                               r  a
                               v  d
                               e  i
                               r  n
                                  g
        <-  return item 30 --
Your app                     Firebase 
                             Database

        -- request item 1 -->
        -- request item 2 -->  S  L
        -- request item 3 -->  e  o
                 .             r  a
                 .             v  d
                 .             e  i
        -- request item 30-->  r  n
                                  g
        <-  return item  1 --     
        <-  return item  2 --      
        <-  return item  3 --
                 .
                 .
                 .
        <-  return item 30 --

我设置了一个jsbin来演示该行为。数据模型非常简单,但它显示了差异。

function loadVideosSequential(videoIds) {
  if (videoIds.length > 0) {
    db.child('videos').child(videoIds[0]).once('value', snapshot => {
      if (videoIds.length > 1) {
        loadVideosSequential(videoIds.splice(1), callback)
      }
    });
  }
}

function loadVideosParallel(videoIds) {
  Promise.all(
    videoIds.map(id => db.child('videos').child(id).once('value'))
  );
}

比较一下:在我的系统上,顺序加载64个项目需要3.8秒,而流水线加载(就像Firebase客户端在本地做的那样)需要600ms。确切的数字将取决于您的连接(延迟和带宽),但流水线版本应该总是明显更快。

 类似资料:
  • 问题内容: 我有一系列键,这些键可以为我的社交网络发布对象,例如/ posts / id /(post info) 当我加载帖子时,我使用的方法先加载/ posts / 0,然后加载/ posts / 1等。 我一次使用A 加载30,速度非常慢。有什么方法可以使用一种查询方法,还是另一种可以使其更快的方法,即使我必须重组JSON树中的数据。 我来自Parse,它重新实现了我的应用程序,到目前为止,

  • apache camel eip框架有一个支持反应流的组件。 从我可以从留档说,reactive流组件仅在单个JVM中工作,将反应性流从/路由到camel。 在一个应用程序中有一个骆驼生产者,在另一个应用程序中有一个骆驼消费者,通过网络产生和消费反应性流,什么是合适的机制? 我假设需要某种中间件,哪种中间件适合这种情况?

  • 我必须从自定义帖子类型返回所有帖子,由'start_date'从'ACF字段'。 我有一些有日期的帖子,还有一些没有日期的帖子。当我添加“orderby”时= 这是我的代码: 如果我删掉 我所有的帖子都被退回,但它们不是按开始日期排序的 有什么想法吗? 谢谢。

  • 问题内容: 我正在创建一个带有按钮的示例网页。此网页正在使用webview在Android中调用。 现在,当我单击网页上的按钮(即html按钮)时。我应该能够在Android中执行一些代码。 如何进行? 问题答案: 我们可以根据Android API文档检测以下HTML元素。 我认为您将能够使用WebView的setOnTouchListener函数获取所有事件。 WebView具有名为HitTe

  • 想改进这个问题吗 通过编辑这篇文章,更新问题,以便用事实和引文来回答。 我有一个网站,由大约20个Java Web应用程序(基于Servlet/JSP的Web应用程序)组成,大小不一,每个应用程序处理网站的不同区域。 所有20个war的总大小为350mb,然而,通过将它们结合起来,我预计最终能够减少这一大小,并实现组合缓存的好处。 最好将它们分开,还是将它们合并到一个Uber webapp war

  • 问题内容: 为了加快JVM的启动时间,Sun开发人员认为在JVM的安装过程中预编译平台的标准运行时类是一个好主意。这些预编译的类可以在以下位置找到: $ JAVA_HOME \ jre \ bin \ client \ classes.jsa 我公司目前正在开发一个带有独立JRE的Java独立应用程序,因此,通过向此jsa文件中添加我们自己的应用程序类来加快我们的应用程序启动时间也是一个不错的选择