2016-10-10 50 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函数的末尾就足以解决此问题。希望这可以帮助别人!请进一步解释评论。

相关问题