簡體   English   中英

使用Scala RX中的FRP管理資源

[英]Managing Resources with FRP in Scala RX

我正在使用scala rx進行應用程序。 我有一個持有File的反應變量(這是一個PDF文件)。 我正在使用庫將此pdf文件中的頁面呈現到屏幕上。 現在我正在使用的PDF庫給了我一個對象(讓我們稱之為Doc ),我可以使用它來渲染單個頁面。 但是,為了從Doc對象呈現頁面,必須打開Doc對象(因此必須獲取資源)。

現在我正在為我正在重新渲染的每個頁面加載pdf文件(創建一個新的Doc對象並在渲染單個頁面后關閉它)。 這使得頁面的呈現起作用(給定文件和頁碼,返回圖像)。

有沒有辦法堅持打開資源在FRP的變化關閉它 ,特別是scala rx 如何處理這種非常常見的情況?

您只需將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關閉一個特定文件並從中返回頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM