2016-11-24 2 views
0

Я получаю самую странную ошибку, и я не знаю, как ее исправить .. У меня есть база данных 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 

Что является абсолютно правильным, но есть две должности, где это только печать один из приведенных выше

+0

Все из '!' В вашей структуре являются потенциальными проблемами. Вам нужно использовать неявно развернутые опции? Разделение любого из них может привести к сбою, если они «ноль». – sbooth

+0

Ни один из них не должен быть nil, что я не понимаю - и как вы можете видеть в нижней части моего вопроса, вывод ни один из значений не равен нулю? @sbooth –

ответ

2

Так как во втором коде вы получаете DataSnapshot своего сообщения, я не думаю, что вам нужно итерации snapshot.

Попробуйте изменить свой код на th есть, посмотрите, работает ли он.

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) 
       let update = Sweet(snapshot: snapshot) 
       self.updates.insert(update, atIndex: 0) 

       dispatch_async(dispatch_get_main_queue(), { 
        self.tableView.reloadData() 
       }) 

      }, withCancelBlock: nil) 

     }, withCancelBlock: nil) 
} 
+0

Фантастический! Я искал это так долго! Большое вам спасибо :-) У вас есть представление о том, как я могу изменить «self.updates»? Если я делаю 'self.updates.reverse()', он говорит, что он не используется и ничего не происходит :( –

+0

Я предполагаю, что вы используете Swift 2, в этом случае напишите 'self.updates = self.updates.reverse()', чтобы повернуть вспять ваш массив. –

+0

Работает как очарование! –

Смежные вопросы