【问题标题】:How to make multiple FetchRequests in one view (SwiftUI)如何在一个视图中发出多个 Fe​​tch 请求(SwiftUI)
【发布时间】:2021-11-04 11:43:30
【问题描述】:

我正在尝试处理一个学校项目,但我无法理解如何获取多个特定数据集。

我有一个名为 GameView 的视图,其中有以下 FetchRequest:

FetchRequest(entity: Player.entity(), sortDescriptors: [], predicate: NSPredicate(format: "isPlaying == %@", true))
var allPlayers: FetchedResults<Player>

“玩家”是一个核心数据实体,具有firstNamelastNamePositionisPlaying 属性

但是,我需要能够根据位置属性为特定玩家分配特定角色。例如,我想将每个具有位置属性“P”的 Player 实体分配给“Pitchers”的 @State 数组,并且我想将每个具有位置属性“SS”的 Player 实体分配给 @State 数组'游击手'。

我唯一想到的就是使用两个不同的谓词发出两个单独的提取请求,但我记得每个视图只能发出一个提取请求。我该如何解决这个问题?

这是我的一些代码。以前,我使用 Observable Object 分配位置,但我想换掉它。

struct GameView: View {
    @ObservedObject var TeamNamesAndColors: TeamAttributes
    // declares all the different variables necessary to represent game state
    @State var GameIsOver: Bool = false
    @State var ProceedToResults: Bool = false
    @State var IsInningTop: Bool = true
    @State var InningNumber: Int = 1
    @State var CurrentBatter: [String: String] = ["FirstName": "", "LastName": "", "Position": ""]
    @State var HitterIndexHome: Int = 1
    @State var HitterIndexAway: Int = 1
    @State var AwayPitcher: [String: String] = ["FirstName": "", "LastName": ""]
    @State var HomePitcher: [String: String] = ["FirstName": "", "LastName": ""]
    @State var CurrentPitcher: [String: String] = ["FirstName": "", "LastName": "", "Position": ""]
    @State var BSOCount: [String: Int] = ["Balls": 0, "Strikes": 0, "Outs": 0]
    @State var BasesState: [String: Bool] = ["1B": false, "2B": false, "3B": false]
    @State var AwayTeamScore: Int = 0
    @State var HomeTeamScore: Int = 0
    // used to present different navigation buttons or Pitch Sheet
    @State var showPitchView = false
    @State var goBackHome = false
    @State var finishEarly = false
    
    // checks which position in the lineup is the pitcher, and assigns it the pitcher role
    func SetAwayPitcher() {
        if AnHDetails.Hitter1APos == "P" {
            AwayPitcher["FirstName"] = AnHDetails.hitter1AFirst
            AwayPitcher["LastName"] = AnHDetails.hitter1ALast
        } else if AnHDetails.Hitter2APos == "P" {
            AwayPitcher["FirstName"] = AnHDetails.hitter2AFirst
            AwayPitcher["LastName"] = AnHDetails.hitter2ALast
        } else if AnHDetails.Hitter3APos == "P" {
            AwayPitcher["FirstName"] = AnHDetails.hitter3AFirst
            AwayPitcher["LastName"] = AnHDetails.hitter3ALast
        } else if AnHDetails.Hitter4APos == "P" {
            AwayPitcher["FirstName"] = AnHDetails.hitter4AFirst
            AwayPitcher["LastName"] = AnHDetails.hitter4ALast
        } else if AnHDetails.Hitter5APos == "P" {
            AwayPitcher["FirstName"] = AnHDetails.hitter5AFirst
            AwayPitcher["LastName"] = AnHDetails.hitter5ALast
        } else if AnHDetails.Hitter6APos == "P" {
            AwayPitcher["FirstName"] = AnHDetails.hitter6AFirst
            AwayPitcher["LastName"] = AnHDetails.hitter6ALast
        } else if AnHDetails.Hitter7APos == "P" {
            AwayPitcher["FirstName"] = AnHDetails.hitter7AFirst
            AwayPitcher["LastName"] = AnHDetails.hitter7ALast
        } else if AnHDetails.Hitter8APos == "P" {
            AwayPitcher["FirstName"] = AnHDetails.hitter8AFirst
            AwayPitcher["LastName"] = AnHDetails.hitter8ALast
        } else if AnHDetails.Hitter9APos == "P" {
            AwayPitcher["FirstName"] = AnHDetails.hitter9AFirst
            AwayPitcher["LastName"] = AnHDetails.hitter9ALast
        }
    }
    // same thing as previous func
    func SetHomePitcher () {
        if AnHDetails.Hitter1HPos == "P" {
            HomePitcher["FirstName"] = AnHDetails.hitter1HFirst
            HomePitcher["LastName"] = AnHDetails.hitter1HLast
        } else if AnHDetails.Hitter2HPos == "P" {
            HomePitcher["FirstName"] = AnHDetails.hitter2HFirst
            HomePitcher["LastName"] = AnHDetails.hitter2HLast
        } else if AnHDetails.Hitter3HPos == "P" {
            HomePitcher["FirstName"] = AnHDetails.hitter3HFirst
            HomePitcher["LastName"] = AnHDetails.hitter3HLast
        } else if AnHDetails.Hitter4HPos == "P" {
            HomePitcher["FirstName"] = AnHDetails.hitter4HFirst
            HomePitcher["LastName"] = AnHDetails.hitter4HLast
        } else if AnHDetails.Hitter5HPos == "P" {
            HomePitcher["FirstName"] = AnHDetails.hitter5HFirst
            HomePitcher["LastName"] = AnHDetails.hitter5HLast
        } else if AnHDetails.Hitter6HPos == "P" {
            HomePitcher["FirstName"] = AnHDetails.hitter6HFirst
            HomePitcher["LastName"] = AnHDetails.hitter6HLast
        } else if AnHDetails.Hitter7HPos == "P" {
            HomePitcher["FirstName"] = AnHDetails.hitter7HFirst
            HomePitcher["LastName"] = AnHDetails.hitter7HLast
        } else if AnHDetails.Hitter8HPos == "P" {
            HomePitcher["FirstName"] = AnHDetails.hitter8HFirst
            HomePitcher["LastName"] = AnHDetails.hitter8HLast
        } else if AnHDetails.Hitter9HPos == "P" {
            HomePitcher["FirstName"] = AnHDetails.hitter9HFirst
            HomePitcher["LastName"] = AnHDetails.hitter9HLast
        }
    }
    // decides batter's position and initializes CurrentBatter
    func SetFirstHitter() {
        CurrentBatter["FirstName"] = AnHDetails.hitter1AFirst
        CurrentBatter["LastName"] = AnHDetails.hitter1ALast
        CurrentBatter["Position"] = AnHDetails.Hitter1APos
    }
    // sets the HomePitcher to be the active pitcher to begin the game
    func SetFirstPitcher() {
        CurrentPitcher["FirstName"] = HomePitcher["FirstName"]
        CurrentPitcher["LastName"] = HomePitcher["LastName"]
    }

【问题讨论】:

  • 我们需要一些代码来解决这个问题,但通常情况下,您无需将 CoreData 属性放入单独的数组中即可随意使用。
  • 哦,好吧。否则我将如何识别它们?获取结果后,如何访问某些特定的结果?
  • .filter 是一种方式。
  • 我很困惑。假设我有以下内容: func SetFirstHitter() { CurrentBatter["FirstName"] = CurrentBatter["LastName"] = CurrentBatter["Position"] = }我会这样做吗?
  • 我最初避免这样做是因为您使用的是 CoreData,但请参阅:How do I ask a good question?How to create a Minimal, Reproducible Example。您发布的代码的问题只是它是一组用于过滤某些玩家的蛮力函数。但是,回答您的问题所需的代码是 var body 代码,它显示了您希望如何使用它。您是在修改属性还是仅显示它们?我们无法以这种方式帮助您。

标签: swift core-data swiftui


【解决方案1】:

这是一种使用两个 ForEach 的方法作为列表内的部分(iOS 15):

struct TwoFetchedRequests: View {
    // #1
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.sort, ascending: true)],
        animation: .default)
    private var items: FetchedResults<Item>

    // #2
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Favorite.sort, ascending: true)],
        animation: .default)
    private var favorites: FetchedResults<Favorite>

    var body: some View {
       List {
           // #1
           Section {
               ForEach(items) { item in
                   Text(item.fullName)
               }
           } header: {
               Text("Items")
           }
           
           // #2
           Section {
               ForEach(favorites) { fav in
                   Text(fav.fullName)
               }
           } header: {
               Text("Favorites")
           }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 2018-07-26
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多