refactor(ai-pick): 卡片缓存改为 AppStorage

This commit is contained in:
clz
2026-07-21 21:30:00 +08:00
parent b160360385
commit b81600b90e
2 changed files with 13 additions and 26 deletions
+13 -6
View File
@@ -1,7 +1,9 @@
import router from '@ohos.router';
import { CardData, PickTabData } from './AiPickTypes';
import { CardData, CardsDataCache, PickTabData } from './AiPickTypes';
import { fetchAiPickTabs, parseRawTabs } from './AiPickApi';
import { AiPickStorage } from './AiPickStorage';
// 顶层缓存 key:对应 Vue 端 __GLOBAL__.cardsDataCache(跨组件/跨页面共享)
const APP_STORAGE_CACHE_KEY = 'cardsDataCache';
@Observed
export class AiPickModel {
@@ -16,7 +18,7 @@ export class AiPickModel {
// 构造时即同步读出 showData,对应 Vue 端 useCardHandler.showData 三态:
// 1. data_completed=true 且 mod_data[0].data 内嵌 → 直接解析内嵌数据(无需请求)
// 2. 否则从卡片级缓存 AiPickStorage 读出(对应 __GLOBAL__.cardsDataCache
// 2. 否则从 AppStorage 卡片级缓存读出(对应 __GLOBAL__.cardsDataCache
// 3. 都没有 → 空数组,View 层展示 loading;后续 loadData() 异步拉取
constructor(cardData: CardData) {
this.cardData = cardData;
@@ -33,12 +35,13 @@ export class AiPickModel {
return parseRawTabs(embedded);
}
}
return AiPickStorage.get(this.cardKey) ?? [];
const cache = AppStorage.get<CardsDataCache>(APP_STORAGE_CACHE_KEY);
return cache?.[this.cardKey] ?? [];
}
// 拉取数据:
// - data_completed=true:直接完成,不再发请求
// - 其他:调用 fetchAiPickTabs,请求成功后写入 AiPickStorage
// - 其他:调用 fetchAiPickTabs,请求成功后写入 AppStorage
async loadData(): Promise<void> {
if (this.cardData.data_completed === true) {
this.dataReady = true;
@@ -48,7 +51,11 @@ export class AiPickModel {
try {
const data = await fetchAiPickTabs(this.cardData);
this.tabs = data;
AiPickStorage.set(this.cardKey, data);
// 写入 AppStorage:合并式更新(AppStorage 不支持原地改 Map
const current: CardsDataCache = AppStorage.get<CardsDataCache>(APP_STORAGE_CACHE_KEY) ?? {};
const next: CardsDataCache = { ...current };
next[this.cardKey] = data;
AppStorage.setOrCreate<CardsDataCache>(APP_STORAGE_CACHE_KEY, next);
this.dataError = false;
} catch (e) {
// 失败时保留原本的 showData(如有缓存命中)
@@ -1,20 +0,0 @@
// AI选期第二层卡片级 session 缓存
// 对应 Vue 端 __GLOBAL__.cardsDataCache[cardKey]
// 鸿蒙侧不需要 Memory/AppStorage 桥接,直接用 Mapsession 级,不持久化
import { PickTabData } from './AiPickTypes';
export class AiPickStorage {
private static cache: Map<string, PickTabData[]> = new Map();
static get(cardKey: string): PickTabData[] | undefined {
return this.cache.get(cardKey);
}
static set(cardKey: string, data: PickTabData[]): void {
this.cache.set(cardKey, data);
}
static has(cardKey: string): boolean {
return this.cache.has(cardKey);
}
}