Core Data中@FetchRequest能否仅获取特定UUID字段?
有没有简洁的方式通过Core Data的@FetchRequest仅获取单个字段,以此判断特定UUID是否存在于查询结果中?
我现有一个查询,返回一组Token列表,每个Token都有UUID类型的id:
@FetchRequest(sortDescriptors: [SortDescriptor(\.id)]) var tokens: FetchedResults<Token>
我尝试写一个判断Token是否已下载的函数,初始写法如下:
func isDownloaded(tokenId: UUID) -> Bool { return tokens.contains(tokenId) }
能不能修改@FetchRequest使其仅返回Token的id列表?我试了下面的写法:
@FetchRequest(sortDescriptors: [SortDescriptor(\.id)]) var tokens: FetchedResults<Token.ID>
结果报错:
Type 'Token.ID' (aka 'Optional
') does not conform to protocol 'NSFetchRequestResult'
我查过相关内容,但都是关于插入前检查记录是否存在的,不是我要的场景。我需要获取Core Data中已下载Token的id列表来控制下载按钮状态,每次循环单独查询太繁琐。
直接优化判断逻辑
不需要修改@FetchRequest的返回字段,直接利用现有FetchedResults<Token>,通过contains(where:)方法就能高效完成判断,代码简洁且满足需求:
func isDownloaded(tokenId: UUID) -> Bool { tokens.contains(where: { $0.id == tokenId }) }
关于FetchedResults<Token.ID>报错的原因
FetchedResults要求泛型类型必须遵循NSFetchRequestResult协议,而Token.ID本质是Optional<UUID>,并不符合该协议,因此会触发报错。如果确实需要仅获取id字段,可以通过Core Data的NSFetchRequest设置propertiesToFetch属性来实现,但对于你的场景来说,上面的判断逻辑已经足够高效,没必要额外做复杂处理。
更新
根据社区开发者的回复,最终采用的简洁实现就是上述contains(where:)版本,无需修改原有@FetchRequest即可完成需求。
内容的提问来源于stack exchange,提问作者lcj

