2017-12-08 3 views
-1

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?

Antwort

0

So offenbar aufgrund einer Änderung in Swift 4 Verhaltensänderung @objc von Inferenz, sollte ich @objcMembers vor der Klassendeklaration in der Contact.swift Datei hinzufügen

Verwandte Themen