【发布时间】:2021-10-09 21:32:24
【问题描述】:
在一个多语言应用程序中,我让用户通过 Apple、Google 或 Facebook 登录,然后将他们的数据(用户 ID、给定、姓氏等)存储到 UserEntity:
创建实体时,我将stamp 属性设置为当前纪元秒数。
然后在我的自定义视图模型中,我尝试使用以下代码获取至少一个用户并将其分配给@Published var,以便我的应用知道该用户是否已经登录:
class UserViewModel: ObservableObject {
@Published var myUser: UserEntity?
init(language: String) {
fetchMyUser(language: language)
}
func fetchMyUser(language:String) {
print("fetchMyUser language=\(language)")
guard let container = PersistenceController.shared[language]?.container else { return }
let request = NSFetchRequest<UserEntity>(entityName: "UserEntity")
request.sortDescriptors = [ NSSortDescriptor(keyPath: \UserEntity.stamp, ascending: false) ]
request.fetchLimit = 1
do {
myUser = try container.viewContext.fetch(request)[0]
} catch let error {
print("fetchMyUser fetch error: \(error)")
}
}
}
注意:请忽略language 字符串参数(“en”、“de”或“ru”)。它用于选择相应的NSPersistentContainer。此代码有效,与我的问题无关。
我的问题是do/try/catch 代码在容器中还没有实体(用户从未登录)时以Fatal error: Index out of range 失败:
do/try/catch 不应该只捕获这个异常,为什么我的应用程序崩溃以及如何修复我的代码,以便获取 0 或 1 UserEntity 并分配给 myUser?
【问题讨论】:
-
do/try/catch not 捕获 index-out-of-bounds 错误。您必须检查返回对象的数量(或使用
count(for: fetchRequest))。 -
为避免在访问第一个元素时出现此类错误,请使用 (request).first 而不是使用 (request)[0]
标签: ios swift core-data try-catch outofrangeexception