之前只把 3 个 method 标 nonisolated,漏了 keyPrefix 静态常量。actor 内的 ensureReady 访问 method 时跨 actor 拿到 keyPrefix 会触发 MainActor 隔离检查 失败(SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor 项目设置下,未标注则默认 MainActor)。补 nonisolated。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
45 lines
2.0 KiB
Swift
45 lines
2.0 KiB
Swift
//
|
||
// SubGameDirectoryStore.swift
|
||
// ylgamehall
|
||
//
|
||
// 子游戏目录名持久化映射:H5 传的 Gamedirectory(也是 gameStart 同名)→ 实际沙盒
|
||
// 目录名。与 daoqi msext gameController.m:1414 / 2183-2188 等价:
|
||
// - 首次安装:actualDir = directory,写入 NSUserDefaults
|
||
// - 每次 zip 升级(远端 game_version > 本地 version.xml):actualDir 末尾追加 "1",
|
||
// 新版本解压到新目录,旧目录残留在沙盒(msext 同款"追加而非原子替换"策略)
|
||
//
|
||
// 存储约定:UserDefaults key = "ylgh.subGameDir.<directory>",value = 实际目录名
|
||
//
|
||
|
||
import Foundation
|
||
|
||
/// UserDefaults 线程安全,所有方法 nonisolated 让 actor / MainActor / 后台线程都能直接调用。
|
||
public enum SubGameDirectoryStore {
|
||
|
||
nonisolated private static let keyPrefix = "ylgh.subGameDir."
|
||
|
||
/// 当前实际目录名。已持久化 → 返回持久化值;未持久化 → 返回 directory 本身
|
||
/// (对应 msext NSUserDefaults 缺 key 时 gamefilepath = gamename 的默认)。
|
||
nonisolated public static func current(forKey directory: String) -> String {
|
||
UserDefaults.standard.string(forKey: keyPrefix + directory) ?? directory
|
||
}
|
||
|
||
/// 触发升级:末尾追加 "1",写回 UserDefaults,返回新值。
|
||
/// msext gameController.m:1414 等价 `gamefilepath = [NSString stringWithFormat:@"%@1", gamefilepath]`。
|
||
@discardableResult
|
||
nonisolated public static func advance(forKey directory: String) -> String {
|
||
let next = current(forKey: directory) + "1"
|
||
UserDefaults.standard.set(next, forKey: keyPrefix + directory)
|
||
return next
|
||
}
|
||
|
||
/// 首次访问时把 directory 自身写入(与 msext gameController.m:2187
|
||
/// SaveDefaultInfo 等价)。后续 advance 会基于此值追加。
|
||
nonisolated public static func saveInitialIfNeeded(forKey directory: String) {
|
||
let k = keyPrefix + directory
|
||
if UserDefaults.standard.string(forKey: k) == nil {
|
||
UserDefaults.standard.set(directory, forKey: k)
|
||
}
|
||
}
|
||
}
|