Ich habe eine iOS-App in Swift geschrieben. In dieser App versuche ich ein Element aus einer DynamoDB-Tabelle zu laden, aber aus irgendeinem Grund konnte ich kein Element laden, obwohl alle Details korrekt waren.Die Attribute eines Elements können nicht aus einer DynamoDB-Tabelle abgerufen werden
Ich habe das AWS SDK mit CocoaPods installiert, nachdem ich alle Anweisungen befolgt habe, um es korrekt zu installieren. Ich habe die folgenden Bibliotheken installiert: AWSCognito
, AWSCognitoIdentityProvider
, AWSDynamoDB
, AWSS3
, AWSSNS
.
Danach habe ich meine AWS-Anmeldeinformationen in der Info.plist
Datei hinzugefügt:
<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>
ich eine Mapper-Datei Contact.swift
genannt erstellt haben:
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"
}
}
Dann habe ich hinzugefügt die folgende Code in ViewController.swift
Datei, innerhalb der viewDidLoad
Methode. Der Code sollte ein Element aus einer Tabelle erhalten, seine Attribute speichern, und setzen Sie den Namen Attribut der Titel des Bildschirms zu sein:
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.
}
}
Das Problem ist, dass der App stürzt ab, wenn ich versuche, die GlobalVars.name
zuweisen Variable zum Titel der Navigationsleiste. Es stürzt mit der folgenden Meldung ab: Fatal error: Unexpectedly found nil while unwrapping an Optional value
.
Ich habe versucht, taskResult.name
stattdessen zu drucken, aber es nur gedruckt nil
.
Aber es hat nichts auf der Konsole gedruckt. Ich habe den folgenden Code in die Info.plist
Datei hinzugefügt, aber das nicht auch funktioniert:
<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>
Als ich am unteren Rande des Editors in dem Variablen Bereich bin Überprüfung, ich kann sehen, dass alle Attribute des Elements nil
sind.
Nach einer tiefen Suche habe ich etwas sehr seltsam bemerkt. Als ich den Namen der Tabelle in eine Tabelle umgewandelt, die nicht existieren, habe ich die folgende Meldung in der Konsole erhalten:
The request failed. Error: Error Domain=com.amazonaws.AWSDynamoDBErrorDomain Code=7 "(null)" UserInfo={__type=com.amazonaws.dynamodb.v20120810#ResourceNotFoundException, message=Requested resource not found}
Wenn ich es mit einem richtigen Tabellennamen renne, aber mit einem falschen Hash-Schlüssel, der auf einen Gegenstand verweist, der in der Tabelle nicht existiert, bekomme ich nichts. Es stürzt nicht ab oder druckt keine Nachricht auf der Konsole. Es läuft einfach so, als würde ich nichts aus der DynamoDB-Tabelle verlangen.
Was kann ich dagegen tun? Ich habe bereits überall im Internet gesucht, aber ich konnte noch nichts darüber finden ... Könnten Sie mir bitte helfen, das zu lösen?