2016-10-10 74 views
1

我剛剛更新到Swift 3.0語法和XCode 8.0。
我在更新後重新獲得所有內容時遇到了一些問題,但有一件事我無法修復,那就是當向數據庫寫入數據(特別是圖像)時,出現以下錯誤:Swift Firebase:無法在fileURL中存儲_SwiftValue類型的對象

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!)說明,''self.fileURL'打印出來。 – Dravidian

回答

3

經過一段時間的玩耍,我才弄清楚了這一點。在新的Swift 3 Firebase中,你希望你對你正在編寫的內容非常具體。另外,在這個過程中不可能有任何選擇權。

只需將String(self.fileURL)添加到setValue函數的末尾就足以解決此問題。希望這可以幫助別人!請進一步解釋評論。

相關問題