返回

用SwiftUI的@FetchRequest构建动态列表

IOS

导言

SwiftUI 100天系列的第6部分中,我们探索了如何使用@FetchRequest从Core Data中获取数据并将其显示在界面上。在本文中,我们将深入了解@FetchRequest的使用,并构建一个动态列表,以显示图书的标题、评级和作者信息。

使用@FetchRequest

@FetchRequest是一个属性包装器,允许我们从Core Data中获取数据并将其绑定到SwiftUI视图。它使用一个FetchRequest结构体来指定要获取的数据,包括实体类型、排序和谓词。

要使用@FetchRequest,我们首先需要创建一个FetchRequest结构体:

struct FetchRequest<Entity: NSManagedObject>: View {
    let request: NSFetchRequest<Entity>
    
    var body: some View {
        List(request.wrappedValue) { item in
            Text(item.name)
        }
    }
}

在这个例子中,FetchRequest结构体获取Entity类型的实体,其中Entity是遵循NSManagedObject协议的Core Data实体。request属性是一个NSFetchRequest对象,它指定要获取的数据。body属性是一个列表,它显示了request中的实体列表。

接下来,我们可以将@FetchRequest属性包装器添加到我们的视图中:

struct BookwormListView: View {
    @FetchRequest(entity: Book.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Book.title, ascending: true)])
    var books: FetchedResults<Book>
    
    var body: some View {
        List(books) { book in
            Text(book.title ?? "")
        }
    }
}

在这个例子中,@FetchRequest属性包装器获取Book实体,并按title属性升序排序。books属性是一个FetchedResults对象,它包含获取的实体列表。body属性是一个列表,它显示了books中的图书列表。

构建动态列表

现在,让我们扩展我们的BookwormListView以显示图书的评级和作者信息。我们可以通过修改body属性来实现:

struct BookwormListView: View {
    @FetchRequest(entity: Book.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Book.title, ascending: true)])
    var books: FetchedResults<Book>
    
    var body: some View {
        List(books) { book in
            HStack {
                Text(book.title ?? "")
                Spacer()
                HStack {
                    Image(systemName: "star.fill")
                        .foregroundColor(.yellow)
                    Text("\(book.rating)")
                }
            }
        }
    }
}

在这个例子中,我们在每个列表行中添加了一个HStack,它包含图书的标题、一个间距和一个HStack,其中包含一个星形填充符号(表示评级)和图书的评级文本。

结论

@FetchRequest是一个强大的工具,用于从Core Data中获取数据并将其显示在SwiftUI界面上。通过使用@FetchRequest,我们可以轻松地构建动态列表,这些列表会自动更新,反映Core Data中数据的任何更改。