GroupBy在SwiftUI中使用@FetchRequest

GroupBy在SwiftUI中使用@FetchRequest,swift,core-data,swiftui,Swift,Core Data,Swiftui,我有一个快捷的视图,如: @FetchRequest( entity: Message(), sortDescriptors: [NSSortDescriptor(keyPath: \Message.date, ascending: false)] ) var allMessages: FetchedResults< Message.date > var body: some View { NavigationView { List(self

我有一个快捷的视图,如:

@FetchRequest(
    entity: Message(),
    sortDescriptors: [NSSortDescriptor(keyPath: \Message.date, ascending: false)]
) var allMessages: FetchedResults< Message.date >

var body: some View {
    NavigationView {
        List(self.allMessages) { message in
            Text(message.text)
        }
        .navigationBarTitle(Text("Last Messages"))
    }
}
@FetchRequest(
实体:Message(),
sortDescriptors:[NSSortDescriptor(密钥路径:\Message.date,升序:false)]
)var allMessages:FetchedResults
var body:一些观点{
导航视图{
列表(self.allMessages){messagein
文本(message.Text)
}
.navigationBarTitle(文本(“最后消息”))
}
}
我希望FetchRequest只返回每个用户的最后一条消息。我需要用一个小组。有没有办法使用
@FetchRequest
?如果没有,你会怎么做?

一步一步:

  • 创建NSFetchRequest
  • 指定要筛选的NSPredicate 根据你选择的标准
  • 将结果类型设置为“.DictionaryResultType”(对于“分组依据”是必需的)
  • 设置要包含在提取中的属性
  • 将属性设置为“分组依据”
  • 创建一个NSSortDescriptor,按名称降序排序
  • 最后,您可以使用初始值设定项“@FetchRequest(FetchRequest:”)创建@FetchRequest
  • 类TODOItem:NSManagedObject,可识别{ @NSManaged公共变量名称:字符串? @NSManaged公共var注释:字符串? } 扩展到doitem{ 静态func allTODOItem()->NSFetchRequest{ //1º let fetchRequest=NSFetchRequest(entityName:“TODOItem”) //2º //fetchRequest.predicate=NSPredicate(格式:,…) //3º fetchRequest.resultType=.dictionaryResultType //4º //要获得计算的道具,可以使用NSExpression(例如某物的总和) fetchRequest.propertiesToFetch=[“名称”,“注释”] //5º fetchRequest.propertiesToFetch=[“名称”] //6º 让sort=NSSortDescriptor(键:“name”,升序:false) fetchRequest.sortDescriptors=[sort] 返回请求 } } 结构主视图:视图{ @FetchRequest(FetchRequest:TODOItem.allTODOItem())变量项:FetchedResults var body:一些观点{ 文本(“主页”) } } 一步一步:

  • 创建NSFetchRequest
  • 指定要筛选的NSPredicate 根据你选择的标准
  • 将结果类型设置为“.DictionaryResultType”(对于“分组依据”是必需的)
  • 设置要包含在提取中的属性
  • 将属性设置为“分组依据”
  • 创建一个NSSortDescriptor,按名称降序排序
  • 最后,您可以使用初始值设定项“@FetchRequest(FetchRequest:”)创建@FetchRequest
  • 类TODOItem:NSManagedObject,可识别{ @NSManaged公共变量名称:字符串? @NSManaged公共var注释:字符串? } 扩展到doitem{ 静态func allTODOItem()->NSFetchRequest{ //1º let fetchRequest=NSFetchRequest(entityName:“TODOItem”) //2º //fetchRequest.predicate=NSPredicate(格式:,…) //3º fetchRequest.resultType=.dictionaryResultType //4º //要获得计算的道具,可以使用NSExpression(例如某物的总和) fetchRequest.propertiesToFetch=[“名称”,“注释”] //5º fetchRequest.propertiesToFetch=[“名称”] //6º 让sort=NSSortDescriptor(键:“name”,升序:false) fetchRequest.sortDescriptors=[sort] 返回请求 } } 结构主视图:视图{ @FetchRequest(FetchRequest:TODOItem.allTODOItem())变量项:FetchedResults var body:一些观点{ 文本(“主页”) } }
    否,它将崩溃,因为NSFetchedResultsController不支持NSDictionaryResultTypes的更改跟踪和获取请求。我不知道您如何使用NSFetchedResultsController,但我认为在这种情况下,您可以不为获取的结果控制器设置缓存名称或委托,在这种情况下,它不会执行任何更改跟踪。不,它将崩溃,因为NSFetchedResultsController不支持NSDictionaryResultTypes的更改跟踪和获取请求。我不知道您是如何使用NSFetchedResultsController的,但我认为在这种情况下,您可能不需要为获取的结果控制器设置缓存名称或委托,在这种情况下,它不会执行任何更改跟踪。您的用户实体是什么样子的?你有建立关系吗?如果是这样,那么您只需获取所有用户并用列表中的最后一条消息填充列表。@Ludovic,您能找到解决方案吗?我找到的大多数解决方案都是使用
    Dictionary.init(分组方式:)
    手动将其分组。对我来说,这似乎不是最有效的解决方案。您的用户实体是什么样子的?你有建立关系吗?如果是这样,那么您只需获取所有用户并用列表中的最后一条消息填充列表。@Ludovic,您能找到解决方案吗?我找到的大多数解决方案都是使用
    Dictionary.init(分组方式:)
    手动将其分组。对我来说,这似乎不是最有效的解决方案。
    class TODOItem: NSManagedObject, Identifiable {
        @NSManaged public var name: String?
        @NSManaged public var notes: String?
    }
    
    extension TODOItem {
        static func allTODOItem() -> NSFetchRequest<TODOItem> {
            //1º
            let fetchRequest = NSFetchRequest<TODOItem>(entityName: "TODOItem")
            //2º
            //fetchRequest.predicate = NSPredicate(format: "", ...)
            //3º
            fetchRequest.resultType = .dictionaryResultType
            //4º
            // To get computed props you can use NSExpression (for example the sum of something)
            fetchRequest.propertiesToFetch = ["name", "notes"]
            //5º
            fetchRequest.propertiesToFetch = ["name"]
            //6º
            let sort = NSSortDescriptor(key: "name", ascending: false)
            fetchRequest.sortDescriptors = [sort]
    
            return fetchRequest
        }
    }
    
    struct Home : View {
        @FetchRequest(fetchRequest: TODOItem.allTODOItem()) var items: FetchedResults<TODOItem>
    
        var body: some View {
            Text("Home")
        }
    }