amazon-dynamodb - 如何在 SwiftUI 中使用 ObservableObject 加载数据?

标签 amazon-dynamodb swiftui combine

我正在尝试将一个应用程序从 UIKit 转换到 SwiftUI,这取决于基本的 DynamoDB 资源,但我在强制 View 在数据添加到列表时刷新时遇到了障碍。我在这组代码上花费了数小时尝试不同的事情,我想我可能会看看是否有人知道为什么“SessionsData”似乎被丢弃并且不会累积“Sessions”对象。

有没有人有任何快速的想法???

class SessionsData: ObservableObject {

    let didChange = PassthroughSubject<SessionsData, Never>()
    @Published var data: [Sessions] = [] {
        didSet {
            didChange.send(self)
        }
    }

    init() {
        load()
    }

    func load() {
        let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()
        let scanExpression = AWSDynamoDBScanExpression()
        scanExpression.limit = 20

        var temp : [Sessions] = []

        dynamoDBObjectMapper.scan(Sessions.self, expression: scanExpression).continueWith(block: { (task:AWSTask<AWSDynamoDBPaginatedOutput>!) -> Any? in
            if let error = task.error as NSError? {
                 print("The request failed. Error: \(error)")
             } else if let paginatedOutput = task.result {
                for session in paginatedOutput.items as! [Sessions] {
                    print("Item Found")
                    temp.append(session)
                }
                DispatchQueue.main.async {
                    self.data = temp
                    self.didChange.send(self)
                }
             }
            print(self.data.count)
            return true
         })
    }
}
struct Events: View {

    @ObservedObject var sessionsData = SessionsData()


    var body: some View {...}
}

最佳答案

看起来您使代码过于复杂了。 PassthroughSubject 是不必要的。每当您更改 @Published 属性时,它都应该触发更新。

class SessionsData: ObservableObject {

    @Published var data: [Sessions] = []

    init() {
        load()
    }

    func load() {
        let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()
        let scanExpression = AWSDynamoDBScanExpression()
        scanExpression.limit = 20

        var temp : [Sessions] = []

        dynamoDBObjectMapper.scan(Sessions.self, expression: scanExpression).continueWith(block: { (task:AWSTask<AWSDynamoDBPaginatedOutput>!) -> Any? in
            if let error = task.error as NSError? {
                 print("The request failed. Error: \(error)")
             } else if let paginatedOutput = task.result {
                for session in paginatedOutput.items as! [Sessions] {
                    print("Item Found")
                    temp.append(session)
                }
                DispatchQueue.main.async {
                    self.data = temp
                }
             }
            print(self.data.count)
            return true
         })
    }
}

关于amazon-dynamodb - 如何在 SwiftUI 中使用 ObservableObject 加载数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59098343/

相关文章:

ios - Swift 组合 : Run a list of publishers one after the other, 并发布第一个非零元素

amazon-web-services - 在策略中列出 dynamo 的所有权限将不起作用,但通配符可以 dynamodb :*

pagination - 通过 Boto3 进行 DynamoDB 分页,NextToken 不存在但 LastEvaluatedKey 存在?

ios - 如何防止 FetchRequest 观察关系的变化?

swiftui - UIKit > SwiftUI > UIKit 时未显示导航栏项目

swiftui - 当包含文本字段的工作表出现时,如何使文本字段成为焦点

swift - 联合收割机接收@Published更新两次

php - AWS SDK for PHP DynamoDB PutItem 仅适用于非空变量

amazon-dynamodb - 在 dynamoDB 中更新或创建嵌套元素

swiftui - Xcode 11 - SwiftUI 预览暗模式