10个版本
0.3.0 | 2023年5月30日 |
---|---|
0.2.0 | 2022年7月1日 |
0.1.8 | 2022年4月28日 |
0.1.7 | 2021年9月28日 |
0.1.4 | 2021年7月28日 |
#314 在 并发
每月 66 次下载
用于 percy-preview-app
14KB
112 行
app-world
管理前端应用程序状态的框架无关方法。
概述
app-world
是一个简单的线程安全状态管理库,旨在在管理大量应用程序状态的多平台前端应用程序中使用。
使用 app-world
,你有一个单一的 World
,其中包含你的应用程序 State
以及你的应用程序的 Resource
。
Resource
用于与外部世界交互,例如写入本地文件存储或进行API请求。
修改应用程序状态的唯一方式是通过发送一个 Msg
(忽略基于 UnsafeCell
的内部可变性)。
这意味着所有状态修改都可以在一个地方处理,这使得推理应用程序的行为变得容易,并减少了代码重复的可能性。
跨平台应用程序
app-world
没有任何平台相关代码,使其适合编写可以在网络、移动和桌面上运行的跨平台应用程序逻辑。
例如,app-world
可以用于管理在 iOS
、Android
和网络浏览器上运行的Rust核心应用程序的状态。
线程安全
你无法直接获取World的写入保护。向World写入的唯一方式是通过 AppWorld::msg
。
多个线程可以同时从 AppWorld
读取,但每次只有一个 AppWorld::msg
会被处理。
这意味着您可以在多线程应用程序中安全地使用 app-world
,而不用担心死锁。
游戏
多个线程可以同时从 AppWorld
读取,但每次只有一个 AppWorld::msg
会被处理。
这使得 app-world
对于那些需要高性能并希望许多线程能够同时操作世界的游戏来说并不合适。
在这种情况下,考虑使用许多现有的实体组件系统库之一。
示例用法
use app_world::AppWorldWrapper;
struct MyAppWorld {
state: MyAppState,
resources: MyAppResources,
}
struct MyAppState {
count: u32
}
struct MyAppResources {
api_client: Arc<dyn SomeApiClient>
}
enum Msg {
IncrementCount(u8)
}
type MyAppStateWrapper = AppWorldWrapper<MyAppState>;
impl AppWorld for MyAppWorld {
type Msg = Msg;
fn msg(&mut self, message: Msg) {
match msg {
Msg::IncrementCount(increment) => {
self.count += 1;
}
}
}
}
fn main () {
let world = AppWorldWrapper::new(MyAppWorld::new());
let world_clone = world.clone();
assert_eq!(world.read().count, 0);
world.msg(Msg::IncrementCount);
world_clone.msg(Msg::IncrementCount);
assert_eq!(world.read().count, 2);
}