如何将登录HTTP请求返回的user_id传递到其他视图控制器全局使用
解决方案
方案1:使用UserDefaults持久化存储(适合需要保留登录状态、App重启后无需重新登录的场景)
登录成功解析到userID后直接写入UserDefaults:
let decoder = JSONDecoder() let loginResponse = try decoder.decode(LoginResponse.self, from: json) // 按实际类型选择存储方法,id为Int或String都可直接调用set(_:forKey:) UserDefaults.standard.set(loginResponse.data.id, forKey: "loggedInUserID")
需要使用userID的位置直接读取即可:
// 对应id类型读取,示例为Int类型,String类型用string(forKey: "loggedInUserID") guard let userID = UserDefaults.standard.object(forKey: "loggedInUserID") as? Int else { // 无有效用户id的异常处理,比如跳转登录页 fatalError("用户未登录") } let resourceString = "https://*******.herokuapp.com/\(userID)/allergies" guard let resourceURL = URL(string: resourceString) else {fatalError()}
方案2:全局单例类管理用户信息(适合需要管理多用户字段、扩展性要求高的场景)
新建UserManager.swift全局用户管理类:
class UserManager { // 全局唯一实例 static let shared = UserManager() // userID属性,自动同步到UserDefaults实现持久化 var userID: Int? { get { UserDefaults.standard.object(forKey: "loggedInUserID") as? Int } set { UserDefaults.standard.set(newValue, forKey: "loggedInUserID") } } // 禁止外部创建新实例 private init() {} }
登录成功后赋值:
let decoder = JSONDecoder() let loginResponse = try decoder.decode(LoginResponse.self, from: json) UserManager.shared.userID = loginResponse.data.id
其他位置使用时直接读取:
guard let userID = UserManager.shared.userID else { fatalError("用户未登录") } let resourceString = "https://*******.herokuapp.com/\(userID)/allergies" guard let resourceURL = URL(string: resourceString) else {fatalError()}
注意事项
- 不建议直接声明全局裸变量存储userID,会降低代码可维护性,也不方便做登录状态校验
- 如果仅需要会话内临时存储,不需要持久化,可去掉UserManager中属性的get/set绑定,直接声明普通存储属性即可
内容的提问来源于stack exchange,提问作者Andrew Bertram
相关产品推荐
相关产品推荐

