Swift Firebase: не удается сохранить объект типа _SwiftValue в fileURL

#ios #swift #firebase #firebase-realtime-database #swift3

#iOS #swift #firebase #firebase-realtime-database #swift3

Вопрос:

Я только недавно обновился до синтаксиса 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)
        })
    }
}
  

Комментарии:

1. Попробуйте напечатать значение self.fileURL после инициализации.

2.Можете ли вы показать, что self.storageRef.child(metaData!.path!).description, self.fileURL выводится на печать.

Ответ №1:

После небольшой игры я смог это выяснить. В новом Swift 3 Firebase хочет, чтобы вы были предельно конкретны в отношении того, что вы пишете. Кроме того, во время этого процесса не может быть никаких опций.

Простого добавления String(self.fileURL) в конец функции setValue было достаточно, чтобы решить эту проблему. Надеюсь, это может помочь другим! Пожалуйста, прокомментируйте для дальнейшего объяснения.