首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用FRP管理Scala RX中的资源

用FRP管理Scala RX中的资源
EN

Stack Overflow用户
提问于 2014-06-01 17:48:52
回答 1查看 168关注 0票数 5

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

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

是否有一种方法来坚持一个开放的资源,关闭它的改变在一般玻璃钢,特别是scala rx?如何处理这种非常普遍的情况?

EN

回答 1

Stack Overflow用户

发布于 2014-10-08 13:39:34

您可以简单地将Doc对象括起来。所以,与其呈现存在

代码语言:javascript
复制
def render(file: File, pageNumber: Int): Image =  // blah blah blah

改为:

代码语言:javascript
复制
def open(file: File): (Int => Image) = {
  val doc = // call your library to read file
  (x: Int) => doc.getPage(x)
}

然后将函数open传递给您所响应的任何页面更改信号。

编辑:哦,我明白了,所以您是说每当文件:文件信号更改为不同的文件时,它就会关闭文件。在这种情况下,您应该能够这样做:

代码语言:javascript
复制
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:为了澄清,如果在玻璃钢上设置一个“功能相组装网络/在某个信号相位上运行网络”的区别,则在组装阶段只调用上述函数一次。换句话说,pageGetterRx (一个糟糕的名字,我完全知道)不参与FR方式,而是返回一个lambdas的信号,每一个关闭一个特定的文件并从其中返回页面。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23982686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档