Goby 1.1.0

Goby 1.1.0

测试已测试
语言语言 Obj-CObjective C
证书 eclipse
发布最新发布Sep 2017

Mike Fikes 维护。



Goby 1.1.0

  • Mike Fikes

使用 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 以了解该代码的实际使用情况。

大致步骤如下

  1. 设置同级 iOS 和 ClojureScript 项目,并使 Goby iOS 和 ClojureScript 代码对每个项目都可用。(Shrimp 项目提供了一个通过 CocoaPods 和 Clojars 管理依赖关系的实际工作示例。)
  2. 您的应用中的 ClojureScript 编译成 JavaScript,并在 iOS 项目包中作为引用包括。
  3. 在您的 [AppDelegate application:didFinishLaunchingWithOptions:] 中设置 GBYManager 实例,加载 ClojureScript 编译的 JavaScript,并根据需要添加一些回调处理程序以进行日志记录和计时器。
  4. 按照常规方法,在Xcode的界面构造器中使用Storyboard创建视图,并像平时一样将UI元素连接到视图控制器的头文件。通过扩展GBYViewController创建一个“粘合”UIViewController类来表示这个视图。当视图加载时,使视图控制器调用ClojureScript,传递 UIKit 元素装饰引用。
  5. 在ClojureScript方面,创建一个与你的视图控制器名称相同的命名空间,并使用defui宏为每个UI元素设置原子,并使用^:export导出一个方法,该方法可以是Objective-C side用于初始化UI元素原子的方法。(当然,所有这些都可以手动编码,但这是一个Goby代码可以减少每个视图控制器重复劳动的示例。)
  6. 在ClojureScript命名空间中添加代码来设置UI事件处理程序、执行应用程序逻辑(如果需要)、更新UI元素等。换句话说,在ClojureScript中实现你的应用程序逻辑。:)
  7. 像平时一样添加更多视图和视图控制器,以及它们之间的跳转。最终,应用程序主要由一组ClojureScript命名空间组成,涵盖了各种视图控制器,以及填充应用程序所需的辅助应用程序级别的ClojureScript。

REPL

在开发过程中,您可以同时使用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版本或(在您的选择中)任何后续版本下分发。