无法从 DynamoDB 表中获取项目的属性



我有一个用swift编写的iOS应用。在此应用中,我试图从DynamoDB表中加载项目,但是由于某种原因,即使所有细节都正确,我也无法加载任何项目。

我遵循所有说明以正确安装了所有说明后,已经使用Cocoapods安装了AWS SDK。我已经安装了以下库:AWSCognitoAWSCognitoIdentityProviderAWSDynamoDBAWSS3AWSSNS

之后,我在Info.plist文件中添加了AWS凭据:

<key>AWS</key>
<dict>
    <key>DynamoDBObjectMapper</key>
    <dict>
        <key>Default</key>
        <dict>
            <key>Region</key>
            <string>USEast1</string>
        </dict>
    </dict>
    <key>DynamoDB</key>
    <dict>
        <key>Default</key>
        <dict>
            <key>Region</key>
            <string>USEast1</string>
        </dict>
    </dict>
    <key>CredentialsProvider</key>
    <dict>
        <key>CognitoIdentity</key>
        <dict>
            <key>Default</key>
            <dict>
                <key>Region</key>
                <string>USEast1</string>
                <key>PoolId</key>
                <string>myPoolId</string>
            </dict>
        </dict>
    </dict>
</dict>

我已经创建了一个名为 Contact.swift的映射文件:

import UIKit
import AWSDynamoDB
class Contact: AWSDynamoDBObjectModel, AWSDynamoDBModeling {
    var id: String?
    var name: String?
    class func dynamoDBTableName() -> String {
        return "Contacts"
    }
    class func hashKeyAttribute() -> String {
        return "id"
    }
}

然后,我在viewDidLoad方法中的ViewController.swift文件中添加了以下代码。该代码应从表中获取项目,保存其属性,并将其名称属性设置为屏幕标题:

import UIKit
import AWSDynamoDB
class ViewController: UIViewController {
    //MARK: Properties
    struct GlobalVars {
        static let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()
        static let id: String = "id"
        static var name: String?
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        GlobalVars.dynamoDBObjectMapper.load(Contact.self, hashKey: GlobalVars.id, rangeKey: nil).continueWith(block: {(task: AWSTask<AnyObject>!) -> Any? in
            if let error = task.error as NSError? {
                print("The request failed. Error: (error)")
            } else if let taskResult = task.result as? Contact {
                // Save the information
                GlobalVars.name = taskResult.name
                // Set title to the name
                self.navigationItem.title = GlobalVars.name!
            }
            return nil
        })
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

问题在于,当我尝试将GlobalVars.name变量分配给导航栏标题时,应用程序会崩溃。它崩溃了以下消息:Fatal error: Unexpectedly found nil while unwrapping an Optional value

我尝试打印taskResult.name,但它只是打印nil

,但没有向控制台打印任何东西。我已经在Info.plist文件中添加了以下代码,但这也没有用:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
      </dict>
      <key>amazonaws.com.cn</key>
      <dict>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
      </dict>
  </dict>

当我在编辑器底部的变量区域中检查时,我可以看到该项目的所有属性都是nil

经过深入的搜索,我注意到一些非常奇怪的事情。当我将表的名称更改为不存在的表时,我在控制台中收到了以下消息:

The request failed. Error: Error Domain=com.amazonaws.AWSDynamoDBErrorDomain Code=7 "(null)" UserInfo={__type=com.amazonaws.dynamodb.v20120810#ResourceNotFoundException, message=Requested resource not found}

当我使用正确的表名称运行时,但是使用错误的哈希键,它指的是表中不存在的项目,我什么都没有。它不会崩溃或打印到控制台的消息。它只是继续运行,就像我不在DynamoDB表中要求任何东西。

我该怎么办?我已经在互联网上搜索了,但是我还找不到任何内容...您能帮我解决这个问题吗?

显然,由于swift 4行为的变化 @objc的变化,我应该在 Contact.swift文件中的类声明之前添加 @objcMembers

相关内容

  • 没有找到相关文章

最新更新