2016-10-10 16 views
1

私は最近Swift 3.0の構文とXCode 8.0に更新しました。
私はアップデート後にすべてを元に戻すことに少し苦労しましたが、データ(特にイメージ)をデータベースに書き込むときに修正できなかったことが1つあります。次のエラーが表示されます。Swift Firebase:_SwiftValueタイプのオブジェクトをfileURLに格納できません

Terminating app due to uncaught exception 'InvalidFirebaseData', reason: '(setValue:) Cannot store object of type _SwiftValue at fileURL. Can only store objects of type NSNumber, NSString, NSDictionary, and NSArray.' 

これは私の現在の書き込みプロセスです。あなたが提供できるどんな助けも大いにありがとう!

let roomRef = FIRDatabase.database().reference() 

class Data { 

    static let dataService = Data() 

    fileprivate var _BASE_REF = roomRef 
    fileprivate var _ROOM_REF_ = roomRef.child("rooms") 

    fileprivate var _BASE_REF2 = roomRef 
    fileprivate var _ROOM_REF_2 = roomRef.child("contents") 

    var BASE_REF: FIRDatabaseReference { 
     return _BASE_REF 
    } 

    var ROOM_REF: FIRDatabaseReference { 
     return _ROOM_REF_ 
    } 

    var storageRef: FIRStorageReference { 
     return FIRStorage.storage().reference() 
    } 


    var fileURL: String! 

    func createNewPost(_ user: FIRUser, title: String, author: String, date: String, story: String, data: Foundation.Data) { 
     let filePath = "\(user.uid)/\(Int(Date.timeIntervalSinceReferenceDate))" 
     let metaData = FIRStorageMetadata() 
     metaData.contentType = "image/jpg" 
     storageRef.child(filePath).put(data, metadata: metaData) { (metaData, error) in 
      if let error = error { 
       print("Error Uploading: \(error.localizedDescription)") 
       return 
      } 
      //creating the URL 
      self.fileURL = metaData!.downloadURLs![0].absoluteString 
      if let user = FIRAuth.auth()?.currentUser { 
       let idRoom = self.BASE_REF.child("rooms").childByAutoId() 
       idRoom.setValue(["title": title, "author": author, "date": date, "story": story, "ThumbnailURLFromStorage": self.storageRef.child(metaData!.path!).description, "fileURL": self.fileURL]) 
      } 
     } 
    } 

    func fetchData(_ callback: @escaping (Room) ->()) { 
    Data.dataService.ROOM_REF.observe(.childAdded, with: { (snapshot) in 
      let room = Room(key: snapshot.key, snapshot: snapshot.value as! Dictionary<String, AnyObject>) 
      callback(room) 
     }) 
    } 
} 
+0

初期化の後に 'self.fileURL'の値を表示してください。 –

+0

'self.storageRef.child(metaData!.path!)。description、' 'self.fileURL'の内容を表示できますか? – Dravidian

答えて

3

私はこれを理解することができました。新しいSwift 3 Firebaseでは、あなたが書いていることに関して非常に具体的であることを望んでいます。さらに、このプロセス中にはオプションの並べ替えができません。

String(self.fileURL)をsetValue関数の最後に単に追加するだけで、この問題を解決できました。うまくいけば、これは他人を助けることができる!詳しい説明はコメントしてください。

関連する問題