Clojure的core.async是否可以与RoboVM一起使用?

时间:2014-01-28 00:00:35

标签: clojure robovm core.async

我使用lein-fruit生成了一个基于Clojure的项目,该项目通过RoboVM定位到iOS。我已经引入了core.async来沿通道传递按钮,但是改变go块中的按钮似乎没有效果。

有理由相信core.async的Java实现在RoboVM下不起作用吗?

这是我的代码,稍微修改了基本的lein-fruit模板。

(ns core-async-demo.core
  (:require [core-async-demo.core-utils :as u]
            [clojure.core.async :refer [go chan put! <!]]))

(def window (atom nil))

(def taps (chan))

(defn init
  []
  (let [main-screen (u/static-method :uikit.UIScreen :getMainScreen)
        button-type (u/static-field :uikit.UIButtonType :RoundedRect)
        button (u/static-method :uikit.UIButton :fromType button-type)
        normal-state (u/static-field :uikit.UIControlState :Normal)
        click-count (atom 0)]
    (doto button
      (.setFrame (u/init-class :coregraphics.CGRect 115 121 91 37))
      (.setTitle "Click me!" normal-state)
      (.addOnTouchUpInsideListener
        (proxy [org.robovm.cocoatouch.uikit.UIControl$OnTouchUpInsideListener] []
          (onTouchUpInside [control event]
            (put! taps true)))))
    (reset! window (u/init-class :uikit.UIWindow (.getBounds main-screen)))
    (go
      (loop [_ (<! taps)]
        (.setTitle button (str "Click #" (swap! click-count inc)) normal-state)
        (recur (<! taps))))
    (doto @window
      (.setBackgroundColor (u/static-method :uikit.UIColor :lightGrayColor))
      (.addSubview button)
      .makeKeyAndVisible)))

1 个答案:

答案 0 :(得分:4)

我并不特别了解RoboVM上的core.async,但一般来说后台线程不应该与UIKit交互。这是框架的文档限制。我会尝试更简单的方法来测试RoboVM上的core.async,如果它有效,你应该能够use Grand Central Dispatch在主队列上运行你的代码。