#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 было достаточно, чтобы решить эту проблему. Надеюсь, это может помочь другим! Пожалуйста, прокомментируйте для дальнейшего объяснения.