我使用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)))
答案 0 :(得分:4)
我并不特别了解RoboVM上的core.async,但一般来说后台线程不应该与UIKit交互。这是框架的文档限制。我会尝试更简单的方法来测试RoboVM上的core.async,如果它有效,你应该能够use Grand Central Dispatch在主队列上运行你的代码。