Я получаю самую странную ошибку, и я не знаю, как ее исправить .. У меня есть база данных Firebase со всеми сообщениями, сделанными от пользователей. Они хранятся под feed-items
. Всякий раз, когда пользователь создает новое сообщение, сообщение добавляется к feed-items
, а ключ сообщения в фидах (autoId) добавляется к каждому последующему пользователю.Извлечение данных из Firebase равно неожиданным nil - swift
Если я покажу вам все сообщения от feed-items
в моем UITableView, тогда проблем не будет. Если я попытаюсь показать сообщения, которые совпадают с ключами, хранящимися на личной стене пользователя (ключ, который был добавлен, когда пользователи, за которыми я слежу, делает сообщение), я получаю странную ошибку, говорящую unexpectedly found nil while unwrapping an optional
в моей Sweet
struct?
Позвольте мне первым показать вам два кода, один работает другой не является:
РАБОТА КОД:
func observePosts(userID: String) {
// let ref = FIRDatabase.database().reference().child("Users").child(userID).child("Wall")
// ref.observeEventType(.ChildAdded, withBlock: { (snapshot) in
//
// let postId = snapshot.key
let postReference = FIRDatabase.database().reference().child("feed-items")//.child(postId)
postReference.observeSingleEventOfType(.Value, withBlock: { (snapshot) in
print(snapshot)
var newUpdates = [Sweet]()
for update in snapshot.children {
let postUpdates = Sweet(snapshot: update as! FIRDataSnapshot)
newUpdates.append(postUpdates)
}
self.updates = newUpdates.reverse()
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
})
}, withCancelBlock: nil)
//}, withCancelBlock: nil)
}
НЕ РАБОТАЕТ КОД:
func observePosts(userID: String) {
let ref = FIRDatabase.database().reference().child("Users").child(userID).child("Wall")
ref.observeEventType(.ChildAdded, withBlock: { (snapshot) in
let postId = snapshot.key
let postReference = FIRDatabase.database().reference().child("feed-items").child(postId)
postReference.observeSingleEventOfType(.Value, withBlock: { (snapshot) in
print(snapshot)
var newUpdates = [Sweet]()
for update in snapshot.children {
let postUpdates = Sweet(snapshot: update as! FIRDataSnapshot)
newUpdates.append(postUpdates)
}
self.updates = newUpdates.reverse()
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
})
}, withCancelBlock: nil)
}, withCancelBlock: nil)
}
Где приложение выходит из строя, а строка, в которой я получаю ошибку, находится в моей структуре, в разделе reservedForPost
МОЙ STRUCT
import Foundation
import FirebaseDatabase
import FirebaseAuth
import UIKit
struct Sweet {
let key: String!
let content: String!
let addedByUser: String!
let profilePhoto: String!
var likesForPost : [String:AnyObject]
let itemRef: FIRDatabaseReference?
let path : String!
let date: String!
let category: Int!
let workoutComment: String!
let workoutTime: String!
init (content: String, addedByUser: String, profilePhoto: String!, likesForPost : [String:AnyObject]!, date: String, category: Int, workoutComment: String, workoutTime: String, key: String = "") {
self.key = key
self.content = content
self.addedByUser = addedByUser
self.profilePhoto = profilePhoto
self.likesForPost = likesForPost
self.itemRef = nil
// self.path = dataPath
self.path = ""
self.date = date
self.category = category
self.Comment = Comment
self.Time = Time
}
init (snapshot: FIRDataSnapshot) {
key = snapshot.key
itemRef = snapshot.ref
path = key
if let theFeedContent = snapshot.value!["content"] as? String {
content = theFeedContent
} else {
content = ""
}
if let feedUser = snapshot.value!["addedByUser"] as? String {
addedByUser = feedUser
} else {
addedByUser = ""
}
if let feedPhoto = snapshot.value!["profilePhoto"] as? String! {
profilePhoto = feedPhoto
} else {
profilePhoto = ""
}
if let feedLikes = snapshot.value!["likesForPost"] as? [String:AnyObject]! {
likesForPost = feedLikes
} else {
likesForPost = ["":""]
}
if let feedDate = snapshot.value!["date"] as? String! {
date = feedDate
} else {
date = ""
}
if let feedCategory = snapshot.value!["category"] as? Int! {
category = feedCategory
} else {
category = 0
}
if let feedComment = snapshot.value!["Comment"] as? String! {
Comment = feedComment
} else {
Comment = ""
}
if let feedTime = snapshot.value!["Time"] as? String! {
Time = feedTime
} else {
Time = ""
}
}
func toAnyObject() -> AnyObject {
return ["content":content, "addedByUser":addedByUser, "profilePhoto":profilePhoto!, "likesForPost":likesForPost, "date":date, "category":category, "Comment":Comment, "Time":Time]
}
}
Я знаю, что это длинный пост, но я был бы рад, если вы нашли время, чтобы помочь мне - я полностью потерял! :(
EDIT: Это то, что журнал дает мне:.
Snap (-KXLGyWMljc2UNeRL1a3) {
addedByUser = "Maja P";
category = 1;
content = Hejehjehj;
date = "Nov,24,,2016,,1:20";
likesForPost = {
"user id" = 0;
};
profilePhoto = VGpbOweP4jO2seeLNCGiv1p08jq1;
Comment = "";
Time = "";
}
fatal error: unexpectedly found nil while unwrapping an Optional value
Что является абсолютно правильным, но есть две должности, где это только печать один из приведенных выше
Все из '!' В вашей структуре являются потенциальными проблемами. Вам нужно использовать неявно развернутые опции? Разделение любого из них может привести к сбою, если они «ноль». – sbooth
Ни один из них не должен быть nil, что я не понимаю - и как вы можете видеть в нижней части моего вопроса, вывод ни один из значений не равен нулю? @sbooth –