使用Scala RX中的FRP管理资源

时间:2014-06-01 17:48:52

标签: scala frp

我正在使用scala rx申请。我有一个带有File的反应变量(这是一个PDF文件)。我正在使用库将此pdf文件中的页面呈现到屏幕上。现在我正在使用的PDF库给了我一个对象(让我们称之为Doc),我可以使用它来渲染单个页面。但是为了从Doc对象呈现页面,必须打开Doc对象(因此必须获取资源)。

现在我正在为我正在重新渲染的每个页面加载pdf文件(创建一个新的Doc对象并在渲染单个页面后关闭它)。这使得页面的呈现起作用(给定文件和页码,返回图像)。

是否有办法在FRP中坚持已打开的资源并在更改时将其关闭,特别是scala rx?如何处理这种非常常见的情况?

1 个答案:

答案 0 :(得分:0)

您可以简单地附上Doc对象。所以不是渲染

def render(file: File, pageNumber: Int): Image =  // blah blah blah

将其更改为:

def open(file: File): (Int => Image) = {
  val doc = // call your library to read file
  (x: Int) => doc.getPage(x)
}

然后传递函数open返回您正在做出反应的页面更改信号。

编辑:哦,我明白了,所以你说你希望它在文件发生时关闭文件:文件信号变为另一个文件。在这种情况下,您应该能够做到这样的事情:

def pageGetterRx(file: Rx[File]): Rx[Int => Image] = {
  val doc: Var[Doc] = Var(null)
  val o = file.foreach { f =>
    Option(doc()).foreach(_.close)
    doc() = PdfLib.read(f)  // or however you do the reading
  }
  Rx {
    (x: Int) => doc().getPage(x)
  }
}

编辑2 :为了澄清,如果你强制建立一个"组装功能网络阶段/在一些信号阶段运行网络"在FRP上的区别,上述函数只会被调用一次;在组装阶段。换句话说,pageGetterRx(一个糟糕的名字,我完全清楚)并不参与FR方式,而是返回一个lambdas的信号,每个lambdas关闭一个特定的文件和从它返回页面。