firebase friendslist的行为不一致

时间:2016-05-06 05:29:23

标签: ios firebase firebase-realtime-database

我目前正在尝试使用Firebase设置好友列表关系,我在为用户添加好友的过程中遇到了一些问题。

我目前有这样的架构:

    users                                                           
    -----                                                  
    UID                                                    
     ->Name                                            
     ->Friendslist
       ->UID of friend:true

    userDisplays
    ------------
    -Users Name:Users UID

    addedFriends
    ------------
    -UID of added user
     ->UID Of user that did the adding

我添加朋友的想法是使用用户的名称并在userDisplays树中查找它,该查找似乎每次都有效。但是,当我尝试从userDisplays中的子节点读取uid值时,它有时会返回NULL,或者在找到uid值后将完全跳过添加(我的意思是它不会将uid添加到添加用户而不是创建addedFriends子项。

同样的问题是,当添加用户成功添加所需用户并创建了addedFriends子节点链接两者时,但再次添加的用户检查最近添加时,并且可以选择“添加”它将返回NULL或跳过删除addedFriends子项,并且不将uid添加到用户的朋友列表中。

我试图复制文档中找到的关系示例,但是我对我丢失的东西感到困惑,或者这是否是预期的行为?

这是我创建两个用户后的结构。在创建好友列表之前。

    {
     "userDisplays" : {
       "a" : "fed7738e-7dec-4ff3-9cc9-46dee3c189e6",
       "t" : "c3b27833-d56b-40e9-b46f-c99128193f3d"
     },

    "users" : {
       "c3b27833-d56b-40e9-b46f-c99128193f3d" : {
       "displayName" : "t",
       "email" : "test@test.com",
       "provider" : "password"
     },
      "fed7738e-7dec-4ff3-9cc9-46dee3c189e6" : {
      "displayName" : "a",
      "email" : "test2@test.com",
      "provider" : "password"
    }
 }
}

这是我用来执行添加给定用户名的朋友的快速代码:

ref.userDisplayBaseSingleton.childByAppendingPath("/\(userName)").observeSingleEventOfType(.Value, withBlock: { snapshot in
            if snapshot.value is NSNull{
                print("null")
            }else{
                print(snapshot.value)
                print("found val")
                ref.userBaseSingleton.childByAppendingPath(snapshot.value as! String).observeSingleEventOfType(.Value, withBlock: { (snap) in

                    let friendData = [
                        snap.key:true
                    ]

                    ref.userBaseSingleton.childByAppendingPath("\(currentUser!.id!)/friends").updateChildValues(friendData)

                    let currentAddData = [
                        snap.key:currentUser!.id!
                    ]

                    let friendAddRef = ref.addBaseSingleton.childByAutoId()
                    friendAddRef.setValue(currentAddData)

                })
            }
        })

基本上我从这个片段中遇到的问题是,有时从userDisplays查找不会返回值,或者如果它没有添加addedFriends节点。我在重新尝试重新添加用户名时遇到了一个错误,但它实际上会生成users的新uid,然后生成一个新的addedFriends子项。

例如,如果我是用户t并且我尝试添加a,则可能会发生一些行为。

  1. a的userDisplay返回null
  2. userDisplay返回a并返回uid,但未生成addedFriends节点
  3. a已正确添加,并生成addedFriends节点,但是当user a收到添加通知时,可以选择添加t似乎重现同样的错误。
  4. 我注意到一段时间后,uid的实际t将在firebase上更新,然后添加就会成功。我这意味着uid分配给t的初始} { "addedFriends" : { "-KH6pR5TV7vjVeADc7mc" : { "22a3c5fa-e578-4ada-b3c1-355add80041e" : "098804cd-1ffa-4508-b353-6f6a4377661f" } }, "userDisplays" : { "test" : "f0bb77a9-8156-4d44-ad74-6d6b01765802", "test2" : "098804cd-1ffa-4508-b353-6f6a4377661f" }, "users" : { "098804cd-1ffa-4508-b353-6f6a4377661f" : { "displayName" : "test2", "email" : "test2@test.com", "friends" : { "22a3c5fa-e578-4ada-b3c1-355add80041e" : true }, "provider" : "password" }, "f0bb77a9-8156-4d44-ad74-6d6b01765802" : { "displayName" : "test", "email" : "test@test.com", "provider" : "password" } } } 会发生变化,然后我注意到上面的代码会有效。我还假设其更新的原因与发生的错误有关,但我可能是错的。
  5. 下面是发生错误的片段

    {{1}}

0 个答案:

没有答案