提前感谢您的帮助。我正在尝试使用AWS iOS SDK(Swift)从一个DynamoDb表中获取批处理项目(加载多个)项目。我可以使用Block语法加载一个项目,但是我需要加载10个或更多。我不想使用10个Block调用来单独加载它们。我试图遵循附加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
}
答案 0 :(得分:0)
尝试使用以下代码(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
}
答案 1 :(得分:0)
您的问题是“如何使用对象映射器”,但不使用它可能会更有效。
但是,有一种使用它的方法。请参阅Niklas的答案here和here(他复制并粘贴),但有关它的一些内容使我感到不知所措。我想断言它不如内置批处理功能快,但是我不确定。我怀疑这不能并行完成项目,或者至少不能像BatchGetItem中那样有效。
请参见docs:“为了最小化响应延迟,BatchGetItem并行检索项目。”
According to Yosuke,“截至2016年,“ AWSDynamoDBObjectMapper目前不支持批处理获取项。如果要使用对象映射器,则需要一次加载一个项。” 。我正在使用一个落后几个版本的版本,但并不落后。有人检查。
总而言之,如果您一次加载一个项目,则可能会错过BatchGetItem的整个目的(低延迟)。
从包括约翰·戴维斯(John Davis)的问题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
}
}