ios - 处理大量的 Swift 类

标签 ios swift

以 iOS 9+ 为目标,使用 Swift 3

我的应用程序使用了数百个(可能还有数千个)Swift 类。

每个类(class)负责绘制特定的矢量图。艺术品在 Sketch 中创建,并使用 PaintCode 插件导出为 Swift 类。每个类都可能非常复杂和冗长,包含大量数据。然后将类文件提供给自动命令行工具,该工具将特定于应用程序的功能写入文件,使艺术变得互动和灵活。生成的 Swift 文件被添加到应用程序的 Xcode 项目中。

由于 Swift 不允许按名称动态加载/创建类的 Objective-C 风格(请随时纠正),我的应用程序将处理后的 Swift 类添加到绘图类的查找表中。当应用需要绘制特定的艺术品时,会读取类查找表,返回相关类,然后用于绘制艺术品。

我担心一旦项目开始全面生产,这种方法可能就不可行了,届时将生成成百上千个类。可能的问题包括:

  • 编译时间
  • 代码大小
  • 应用加载时间
  • Xcode/SourceKitServer 稳定性/崩溃

为此,我希望获得有关在可能的问题成为交易破坏者之前克服这些问题的建议。

具体来说:

问。我应该采取什么方法来尽量减少重新编译?在框架或其他机制中将类组捆绑在一起是否可行?

问。代码大小和应用程序加载时间也是如此。如何对代码进行分组,以便更轻松地按需延迟加载类组?框架是否有助于解决这些问题?

如有任何建议或我可能遗漏的其他注意事项,我们将不胜感激。

[编辑 - 许多个月后的大量工作]

出于上述原因,我放弃尝试使用 PaintCode 或其他艺术即代码解决方案。

虽然这些产品非常适合少量的艺术作品,但该系统无法很好地扩展到大规模生产,当然也不适合 Swift 及其在 Xcode 8 中的支持状态。

相反,我采用了一种基于文件的方法,即在 Sketch 中准备艺术品,并用绘图信息标记图层。这些导出为 SVG。引擎加载 SVG 按需,解析它,标记用于指示/指导特定于应用程序的逻辑和绘图。由于涉及的工作量,这对于少量艺术作品来说是不可行的——坚持使用 PaintCode——但一旦完成,它会提供很大的灵 active 和速度,而不会出现所有 Xcode 和 sourcekitservice 崩溃。

这种方法允许像往常一样处理艺术 Assets :在文件夹中分组、按需加载、缓存、发布等。

最佳答案

我完全支持 swift,但考虑到您提到的限制,objc 可能是您完成此类任务的工具。或者,您可以想出一个脚本解决方案。几个想法:

  1. 您应该栅格化您的作品:为什么要对它进行编码?该平台以及您提到的每项技术都是苹果技术,因此有助于将其应用程序用作指南:每个苹果应用程序都使用内置控件或大量光栅化图形。 (示例包括:Logic Studio、Window Server (Aqua)、garage band、Calendar 等)这是因为位图操作速度很快。数千个类中的数百万个 UIBezier 复杂一千倍,并且可能会破坏您的性能,因为所有这些数学运算都必须在 cpu 上完成,而不是在 gpu 上进行简单的位图拉伸(stretch)。 Apple 在 cocoa session 上详细讨论了这个问题。
  2. Swift 运行时不够成熟,无法处理代码卸载。您表面上可以在 swift dylib 上调用 dlopen(),它应该可以工作,但它与使用真正的 swift 类有很大不同。 Swift 没有动力来支持这一点。您也不能调用 dlclose()。 Apple 的 Swift Bug Tracker 明确表示不支持 dlclose。 (事实上​​ ,他们说他们不会支持它!)所以如果你真的有成千上万个巨大的类,一旦它们被加载,你将无法可靠地卸载它们。在 swift 中,你不能像这样解决问题。

  3. 如果您坚持以这种方式做事,您应该从一开始就研究将 CGGraphicsContext 工作卸载到其他线程,因为您将不得不管理大量旨在发生的工作在主线程上。我怀疑绘画代码会发出正确的代码来处理这种情况。

关于ios - 处理大量的 Swift 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41007100/

相关文章:

ios - Core Plot numberForPlot 的值不会大于 1

ios - Swift - AudioKit AKMidi 到 AKSequencer

ios - 如何通过单击 tableview 单元格上的按钮来获取文档 ID?

ios - 即使删除节数据并重新加载 UICollectionView 后,节标题仍然存在

ios - Xcode 13/iOS15 的启动时间比预期的要长,它显示了与 LLDB 相关的消息

ios - 如何以编程方式快速将 subview 添加到自定义 View

ios - 开发人员可以在 Windows 应用程序中使用 iCloud 吗?

javascript - .removeAttr ('style' ) 在 ipad 上似乎无法正常工作

ios - 按下按钮时动态更改标签 - iOS Swift

ios - viewDidAppear 上的动画 View 无法正常工作 - Swift