2017-05-09 27 views
0

我想獲得與該事件對應用戶無法獲取火力地堡調用觀察/ observeSingleEvent回調

我有活動的列表

let eventsRef = FIRDatabase.database().reference.child("Events") 

我有用戶

列表
let usersRef = FIRDatabase.database().reference.child("Users") 

我的事件和用戶模型如下

  • 活動
    • 事件1
      • eventHost:user1_uid
    • 事件2
      • eventHost:user2_uid
  • 用戶
    • 用戶1
      • 電子郵件:EMAIL1
    • 用戶2
      • 電子郵件:EMAIL2

以下的回調(在事件模型)則永遠不會調用:

if let userKey = eventData["eventHost"] as? String { 
    userRef = usersRef.child(userKey) 
    userRef.observeSingleEvent(of: .value, with: { snapshot in 
    ...   
    }) 
} 

我可以證實,我沒有啓用磁盤持久性和UID用戶可用。有什麼我明顯錯誤的嗎?

====== 編輯:簡化事件模型

import Foundation 
import Firebase 

class Event { 

    // event metadata 
    private var _eventId: String! 
    private var _eventHost: User! 

    var eventId: String { 
     return _eventId 
    } 

    var eventHost: User { 
     return _eventHost 
    } 

    init(eventId: String, eventData: Dictionary<String, Any>) { 
     self._eventId = eventId 

     if let userKey = eventData["eventHost"] as? String { 
      let usersRef = FIRDatabase.database().reference().child("Users") 
      let userRef = usersRef.child(userKey) 
      print(userRef) 
      userRef.observeSingleEvent(of: .value, with: { (snapshot) in 
       print("USERY: \(snapshot.key)") 
       if let userDict = snapshot.value! as? Dictionary<String, Any> { 
        let id = snapshot.key 
        self._eventHost = User(userId: id, userData: userDict) 
       } 
      }) 
     } 

    } 
} 

print(userRef)解析爲

https://xxxx.firebaseio.com/Users/AFHpS3npOga4tfj10GS2HGeT9uJ3` 

這是在我的火力地堡結構有效的對象。火力地堡用戶結構的片段

"AFHpS3npOga4tfj10GS2HGeT9uJ3" : { 
    "email" : "[email protected]", 
    "firstName" : "Wilma", 
    "lastName" : "Flintstone", 
    "profileImageUrl" : "http://images.iimg.in/c/569f4771c45d324bda8b4660-4-501-0-1453279096/google/user-icon-png-pnglogocom.img", 
    "provider" : "Firebase", 
    "userId" : "AFHpS3npOga4tfj10GS2HGeT9uJ3" 
    }, 
+0

我想幫忙,但我沒有看到任何東西,顯然是錯誤的。我認爲當你說回調從未被調用時,你會在其中放置一個斷點? –

+0

@JenPerson是的,我把一個斷點,並沒有得到那 – avinash

+0

如果你在你的觀察功能打印的東西,將執行? –

回答

0

你可以看看你的火力數據庫的規則:

應該是這樣的

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null" 
    } 
} 

爲了讓非認證的人看/寫數據你應該做以下幾點:

{ 
    "rules": { 
    ".read": true, 
    ".write": true 
    } 
} 

從代碼你p ost我沒有看到任何問題... 如果這不起作用,請發佈更多的代碼,並告訴我們你打算做什麼,所以我們可以更好地幫助你。

編輯:爲了配合上述建議,在觀察函數中添加一個取消塊將顯示是否存在規則問題。如果用戶無法訪問節點,在Xcode控制檯會打印「權限被拒絕」

userRef.observeSingleEvent(of: .value, with: { (snapshot) in 
    print("USERY: \(snapshot.key)") 
    if let userDict = snapshot.value! as? Dictionary<String, Any> { 
     let id = snapshot.key 
     self._eventHost = User(userId: id, userData: userDict) 
    } 
}, withCancel: { error in 
    print(error.localizedDescription) 
}) 
+0

是的,它被設置爲讓非認證的人讀/寫數據。我已編輯帖子以包含事件模型的相關/簡化部分。完整的代碼發佈在這裏(https://github.com/themoose3/Recreo/blob/master/Recreo/Event.swift#L133) – avinash

+0

你的代碼是正確的,你可以嘗試添加keepSynced(true)並執行再次? –

+0

我相信只有當你啓用了持久性時纔有效?無論哪種情況,添加它都無濟於事 – avinash