从旧版 Rive Apple 运行时迁移
概述
新的 Rive Apple 运行时是对公共 API 和内部架构的近乎完全重写。虽然从概念上讲大多数操作都有等效项,但两个 API 是不兼容的。任何你想要迁移的旧版 API 中的现有工作都必须使用新 API 重建。
本指南涵盖:
本指南并非详尽无遗,因为那样会与现有通用文档重复。有关特定主题的更多详细信息,请参阅文档的相关章节。
包和导入
新的 Apple 运行时与旧版运行时在同一个 Swift 包和 CocoaPods pod 中可用。两个运行时 API 都在同一个包中,因此你可以使用相同的导入语句导入运行时。
import RiveRuntime
异步 API
新的运行时围绕 Swift Concurrency 构建。大多数设置和查询操作都是异步的,应在 async 上下文中调用。
有关更多信息,请参见 Apple 快速开始指南,了解端到端的设置示例。
常见示例包括:
- 异步创建
Worker - 创建
File和Rive对象 - 创建画板、状态机和视图模型实例
let worker = try await Worker()
let file = try await File(source: .local("my_file", Bundle.main), worker: worker)
let rive = try await Rive(file: file)
生命周期和线程
旧版运行时实际上通过 RiveViewModel 和 RiveView 在主线程上驱动。
新的运行时引入了 Worker 对象用于后台处理,同时仍然在主 actor 上强制执行 API 调用。在实践中:
Worker拥有后台处理上下文File强引用其Worker- 在 worker 上注册的带外资源可以在通过该 worker 创建的文件之间共享
有关更多信息,请参见线程部分获取其他详细信息。
对于大多数应用,推荐使用共享 worker:
actor WorkerProvider {
static let shared = WorkerProvider()
@MainActor
private var cachedWorker: Worker?
@MainActor
func worker() async throws -> Worker {
if let cachedWorker {
return cachedWorker
}
let worker = try await Worker()
cachedWorker = worker
return worker
}
}
共享功能
共享 API
主要的共享 API 领域是通过 RiveFont.fallbackFontsCallback 实现的回退字体。
有关回退字体类型和行为,请参见回退字体。
从 RiveViewModel 到 Rive
使用以下部分作为迁移映射:从磁盘加载文件、创建 Rive 视图和数据绑定。旧版 RiveViewModel 在这些领域的流程变为显式的 File + Rive 设置,然后是新运行时中的 RiveUIView/SwiftUI 表示类型。
从磁盘加载文件
旧版运行时
// 缓存此文件以便重用
let file = try RiveFile(name: "my_rive_file")
let model = RiveModel(riveFile: file)
let viewModel = RiveViewModel(model)
当前运行时
let worker = try await WorkerProvider.shared.worker()
let file = try await File(source: .local("my_rive_file", Bundle.main), worker: worker)
let rive = try await Rive(file: file)
从 URL 加载文件
旧版运行时
let webURL = URL(string: "https://example.com/my_rive_file.riv")!
let file = RiveFile(httpUrl: webURL, loadCdn: false, with: self)
let model = RiveModel(riveFile: file)
let viewModel = RiveViewModel(model)
当前运行时
let worker = try await WorkerProvider.shared.worker()
let webURL = URL(string: "https://example.com/my_rive_file.riv")!
let file = try await File(
source: .url(webURL),
worker: worker
)
let rive = try await Rive(file: file)
从数据(字节)加载文件
旧版运行时
let data: Data = ...
let file = try RiveFile(data: data, loadCdn: false)
let model = RiveModel(riveFile: file)
let viewModel = RiveViewModel(model)