aws dynamodb如何在ios swift

时间:2017-05-16 14:18:43

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

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

AnyObject? is not convertible to Any?

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
                }

2 个答案:

答案 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的答案herehere(他复制并粘贴),但有关它的一些内容使我感到不知所措。我想断言它不如内置批处理功能快,但是我不确定。我怀疑这不能并行完成项目,或者至少不能像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
    }
}