Swift Firebase:无法在 fileURL 中存储 _SwiftValue 类型的对象

Posted

技术标签:

【中文标题】Swift Firebase:无法在 fileURL 中存储 _SwiftValue 类型的对象【英文标题】:Swift Firebase: Cannot store object of type _SwiftValue at fileURL 【发布时间】:2016-10-10 03:22:47 【问题描述】:

我最近刚刚更新到 Swift 3.0 语法和 XCode 8.0。更新后我在让一切恢复正常方面遇到了一些麻烦,但我无法解决的一件事是写入数据时(尤其是图像)到数据库我收到以下错误:

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)
        )
    

【问题讨论】:

初始化后尝试打印self.fileURL的值。 你能显示self.storageRef.child(metaData!.path!).description, self.fileURL 打印出来的内容吗? 【参考方案1】:

在玩了一会儿之后,我能够弄清楚这一点。在新的 Swift 3 中,Firebase 希望您对正在编写的内容非常具体。此外,在此过程中不能有任何类型的选项。

只需将String(self.fileURL) 添加到 setValue 函数的末尾即可解决此问题。希望这可以帮助其他人!请评论以获得进一步的解释。

【讨论】:

以上是关于Swift Firebase:无法在 fileURL 中存储 _SwiftValue 类型的对象的主要内容,如果未能解决你的问题,请参考以下文章

Swift 无法识别 Firebase 用户

Swift,FIrebase - 无法通过 removeAllObservers 删除观察者

无法调用非函数类型“任何?!”的值:- Firebase,Swift3

无法在getDocuments querysnapshot(Swift)中将变量分配给Firebase数据[重复]

Firebase,Swift:无法检索数据

无法重新授权用户更改电子邮件或重置密码(Firebase .. Swift)