我有一个用swift编写的iOS应用。在此应用中,我试图从DynamoDB表中加载项目,但是由于某种原因,即使所有细节都正确,我也无法加载任何项目。
我遵循所有说明以正确安装了所有说明后,已经使用Cocoapods安装了AWS SDK。我已经安装了以下库:AWSCognito
,AWSCognitoIdentityProvider
,AWSDynamoDB
,AWSS3
,AWSSNS
。
之后,我在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