【问题标题】:aws dynamodb how to use object mapper with batch get in ios swiftaws dynamodb 如何在 ios swift 中使用对象映射器批量获取
【发布时间】:2017-05-16 14:18:42
【问题描述】:

提前感谢您的帮助。我正在尝试使用 AWS iOS SDK (Swift) 从一个 DynamoDb 表中获取批量项目(加载多个)项目。我可以使用 Block 语法加载一项,但我需要加载 10 个或更多。我不想使用 10 块调用来单独加载它们。我尝试按照附加的 stackoverflow 链接(给出了类似的解决方案),但我收到以下编译器错误消息。我来自 Java 背景,因此也可能是语法问题。这是加载多个项目的正确方法吗?我不想使用低级 API。任何帮助,我哪里出错了。谢谢。

aws dynamodb how to use object mapper with batch get in ios

let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()
    var tasksList = Array<AWSTask<AnyObject>>()
    for i in 1...10 {
         tasksList.append(dynamoDBObjectMapper.load(AWSCards.self, hashKey: "SH_"+String(i), rangeKey: nil))
    }

     AWSTask.init(forCompletionOfAllTasksWithResults: tasksList).continueWithBlock { (task) -> AnyObject? in
     if let cards = task.result as? [AWSCards] {
      print(cards.count)
         }
     else if let error = task.error {
     print(error.localizedDescription)
       }
     return nil
 }

【问题讨论】:

    标签: ios swift amazon-web-services amazon-dynamodb aws-sdk


    【解决方案1】:

    尝试使用以下代码(Swift 4.1,2018 年 2 月 9 日):

    let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()
            var tasksList = Array<AWSTask<AnyObject>>()
            for i in 1...10 {
    
                 tasksList.append(dynamoDBObjectMapper.load(AWSCards.self, hashKey: "SH_"+String(i), rangeKey: nil))
            }
    
            AWSTask<AnyObject>.init(forCompletionOfAllTasksWithResults: tasksList).continueWith { (task) -> Any? in
                            if let cards = task.result as? [AWSCards] {
                                print(cards.count)
                            }
                            else if let error = task.error {
                                print(error.localizedDescription)
                            }
                            return nil
                    }
    

    【讨论】:

      【解决方案2】:

      您的问题是“如何使用对象映射器”,但不使用它可能更有效。

      但是,有一种方法可以使用它。请参阅 Niklas 的回答 herehere(他复制并粘贴),但我觉得它有些可疑。我想断言它不如内置的批处理获取功能快,但我不确定。我怀疑这不会并行完成项目,或者至少不如 BatchGetItem 有效。

      参见docs:“为了尽量减少响应延迟,BatchGetItem 并行检索项目。”

      According to Yosuke, “目前,AWSDynamoDBObjectMapper 不支持批量获取项。如果您想使用对象映射器,则需要一次加载一项”。截至 2016 年。似乎仍然如此。我使用的版本落后了几个版本,但并没有落后太多。有人检查。

      总之,如果您一次加载一个项目,您可能会错过 BatchGetItem 的全部目的(低延迟)。

      从各种来源,包括约翰戴维斯的问题here,我已经测试并运行了这个 BatchGetItem 结果。来吧。

      import AWSDynamoDB
      
      let primaryKeyToSortKeyDict : [String : String] = .... // Your stuff
      
      var keys = [Any]()
      
      for key in primaryKeyToSortKeyDict.keys {
          let partitionKeyValue = AWSDynamoDBAttributeValue()
          partitionKeyValue?.s = String(key)
          let sortValue = AWSDynamoDBAttributeValue()
          sortValue?.s = String(primaryKeyToSortKeyDict[key]!)
          keys.append(["partitionKeyAttributeName": partitionKeyValue, "sortKeyAttributeName": sortValue])
      }
      
      let keysAndAttributesMap = AWSDynamoDBKeysAndAttributes()
      keysAndAttributesMap?.keys = keys as? [[String : AWSDynamoDBAttributeValue]]
      keysAndAttributesMap?.consistentRead = true
      let tableMap = [table : keysAndAttributesMap]
      
      let request = AWSDynamoDBBatchGetItemInput()
      request?.requestItems = tableMap as? [String : AWSDynamoDBKeysAndAttributes]
      request?.returnConsumedCapacity = AWSDynamoDBReturnConsumedCapacity.total
      
      guard request != nil else {
          print("Handle some error")
          return
      }
      
      AWSDynamoDB.default().batchGetItem(request!) { (output, error) in
          print("Here is the batchgetitem output")
          if error == nil {
              // do output stuff
          } else {
              // handle error
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-05-16
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 2016-06-26
        • 2017-12-16
        • 1970-01-01
        • 1970-01-01
        • 2018-12-07
        相关资源
        最近更新 更多