Contentful动态切换contentTypeId失效问题求助
问题诊断与解决方案
哦,这个问题我之前也碰到过——核心坑点就在静态属性的初始化时机上!
你当前的contentTypeId是个存储型静态属性,它只会在UserFAQs类第一次被加载到内存时计算一次值,之后就固定不变了。哪怕后续Utilities.userType切换成了访客,这个属性也不会重新计算,所以始终返回第一次初始化时的ID(大概率是第一次启动时用户类型为普通用户,所以一直用userFAQs)。
修复方案:改用计算型静态属性
把contentTypeId改成计算型静态属性,这样每次访问它的时候都会重新根据当前用户类型求值,而不是只初始化一次。修改后的代码如下:
final class UserFAQs: EntryDecodable, FieldKeysQueryable, Resource { // 将存储型静态属性改为计算型,每次访问都会重新计算 static var contentTypeId: String { return Utilities.userType == .normalUser ? "userFAQs" : "guestFAQs" } let sys: Sys var sectionIndex: Int? var sectionName: String? var questionName: String? var answer: String? // MARK: Initialization public required init(from decoder: Decoder) throws { print("APIName = \(UserFAQs.contentTypeId)") sys = try decoder.sys() let fields = try decoder.contentfulFieldsContainer(keyedBy: UserFAQs.FieldKeys.self) sectionIndex = try fields.decodeIfPresent(Int.self, forKey: .sectionIndex) sectionName = try fields.decodeIfPresent(String.self, forKey: .sectionTitle) questionName = try fields.decodeIfPresent(String.self, forKey: .questionName) answer = try fields.decodeIfPresent(String.self, forKey: .sectionText) } enum FieldKeys: String, CodingKey { case sectionIndex, sectionTitle, questionName, sectionText } }
为什么这样有效?
- 存储型静态属性:类第一次被访问时就会计算并存储值,后续不会更新。
- 计算型静态属性:每次被调用时都会重新执行代码逻辑,返回最新结果。这样用户类型切换后,每次获取
contentTypeId都会拿到对应的正确ID。
你可以在切换用户类型后打印UserFAQs.contentTypeId的值,确认它已经变成guestFAQs,再发起请求就能拿到访客专属的FAQ内容了。
内容的提问来源于stack exchange,提问作者Francis F
相关产品推荐
相关产品推荐

