使用 ClojureScript 开发 iOS 应用。
platform :ios, '8.0'
pod "Goby", "~> 0.3.1"
此存储库包含一些轻量级的 ClojureScript 和 Objective-C 混合代码,这些代码有助于创建 iOS 应用,其中控制器是用 ClojureScript 写的,而不是 Objective-C 或 Swift。否则,生成的 iOS 应用是本地的,JavaScript 在嵌入的 JavaScriptCore 实例中运行。
整体设计包括各种 UIKit 元素的装饰器,每个都实现了 JSExport
协议,以在 ClojureScript 代码和 UI 元素之间建立互操作性。Goby 将 UI 视为一组可操作或可监听的可变状态,ClojureScript 代码中的原子只是装饰器的引用。
当需要提供诸如 UITableViewDataSource
之类的 Objective-C 协议实现时,Goby 提供了一个等效的 ClojureScript 协议,以及一些混合代码和 reify
宏,以便可以直接在 ClojureScript 中实现 Objective-C 协议。处理了一些 Objective-C 方法可选的情况。
为了使之运转,还包括了一些基础设施混合代码来管理 JavaScript 的加载,以及从 iOS 到 ClojureScript 命名空间的简单方法分派机制。定义了各种 iOS SDK 枚举常量的 ClojureScript 关键字,以简化操作。
因此,Goby 相对简单,只是提供了一些结构,以便帮助在 Objective-C 和 ClojureScript 两边之间建立通信。它不试图提供支持函数式编程风格的复杂框架。但至少可以将您带到用 ClojureScript 编码的地步。:)
这种方法用于构建目前在应用商店中的 一个应用,而这个存储库来自该项目的可重用部分。
查看伴侣工作示例项目 Shrimp 以了解该代码的实际使用情况。
大致步骤如下
[AppDelegate application:didFinishLaunchingWithOptions:]
中设置 GBYManager
实例,加载 ClojureScript 编译的 JavaScript,并根据需要添加一些回调处理程序以进行日志记录和计时器。GBYViewController
创建一个“粘合”UIViewController
类来表示这个视图。当视图加载时,使视图控制器调用ClojureScript,传递 UIKit 元素装饰引用。defui
宏为每个UI元素设置原子,并使用^:export
导出一个方法,该方法可以是Objective-C side用于初始化UI元素原子的方法。(当然,所有这些都可以手动编码,但这是一个Goby代码可以减少每个视图控制器重复劳动的示例。)在开发过程中,您可以同时使用REPL来检查和操作UI以及其他应用程序状态,修订函数实现等。我发现当对Storyboard进行更改或其他重大更改时,我需要重新启动我的iOS应用程序。在Shrimp项目中讨论了建立REPL。
启动时间性能良好。在一台A5设备上(用于iPhone 4s、iPad 2和iPod touch),我的生产应用程序的Google Closure优化的JavaScript大约在380毫秒内加载完毕。
在运行时,iOS中您常常可以在实现滚动表格视图中看到性能问题。在我的生产应用程序中,我使用了由ClojureScript驱动的表格视图,使用ClojureScript侧的数据初始化单元格等,我还没有在滚动时看到延迟。
除此之外,我可以说我已经使用ClojureScript来“编排”其他情况下本机iOS UI和本机iOS动画,并且在这一路径上没有遇到任何性能问题。
对于诸如使用HTTP进行图像检索或REST API调用等任务,我只是利用本机优秀的AFNetworking库,从ClojureScript驱动它。
我已经使用Goby创建了一个生产应用程序,并在App Store中维护Goby,根据需要完善Goby代码的一些方面。因此,代码在某些领域不完整,在其他地方有一些粗糙的边缘,而在其他地方则存在一些有疑问但可用的设计。
对于未来的应用程序,我正专注于使用ClojureScript和Om以及React Native。这导致了一种更合理的架构风格,遵循FP原则,采用不可变性等。Goby是在没有React Native的世界中创建的。我不再推行Goby使用的命令式方法。有关使用ClojureScript学习React Native的信息,请参阅cljsrn.org。
版权 © 2014–2015 Mike Fikes和贡献者
在Eclipse Public License的1.0版本或(在您的选择中)任何后续版本下分发。